Android应用程序在启动摄像头活动时崩溃(Visual studio Xamarin)

Android应用程序在启动摄像头活动时崩溃(Visual studio Xamarin),android,visual-studio,xamarin,camera,Android,Visual Studio,Xamarin,Camera,各位程序员好 在VisualStudio Xamarin中创建我的第一个android应用程序时,我又遇到了一个问题(有很多问题=)。我尝试对Android Marshmallow+进行权限检查。当我尝试启动摄像头活动(MediaStore.ActionImageCapture)时,我的应用程序崩溃了。这是密码 const int REQUEST_CAMERA = 1; const int REQUEST_EXTERNAL_STORAGE = 2; const string cameraPerm

各位程序员好

在VisualStudio Xamarin中创建我的第一个android应用程序时,我又遇到了一个问题(有很多问题=)。我尝试对Android Marshmallow+进行权限检查。当我尝试启动摄像头活动(MediaStore.ActionImageCapture)时,我的应用程序崩溃了。这是密码

const int REQUEST_CAMERA = 1;
const int REQUEST_EXTERNAL_STORAGE = 2;
const string cameraPermission = Android.Manifest.Permission.Camera;
const string storageWritePermission = Android.Manifest.Permission.WriteExternalStorage;
const string storageReadPermission = Android.Manifest.Permission.ReadExternalStorage;
public static class App
{
  public static File _file;
  public static File _dir;
  public static Bitmap bitmap;
  public static string fileName;
}
private bool IsThereAnAppToTakePicture()
{
  Intent intent = new Intent(MediaStore.ActionImageCapture);
  IList<ResolveInfo> availableActivities =
  PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
  return availableActivities != null && availableActivities.Count > 0;
}
private void CreateDirectoryForPictures()
{
  App._dir = new File(Enviroment.GetExternalStoragePublicDirectory(Enviroment.DirectoryPictures), "Kuponguru");
  if (!App._dir.Exists())
  {
    App._dir.Mkdirs();
  }
}
private void StartCameraActivity()
{
  Intent intent = new Intent(MediaStore.ActionImageCapture);
  App.fileName = String.Format("picture_{0}.jpg", Guid.NewGuid());
  App._file = new File(App._dir, App.fileName);
  intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App._file));
  StartActivityForResult(intent, REQUEST_CAMERA);
}
protected override void OnCreate(Bundle savedInstanceState)
{
  base.OnCreate(savedInstanceState);
  SetContentView(Resource.Layout.TakePicture);
  pictureImageButton = FindViewById<ImageView>(Resource.Id.pictureButton);
  pictureImageButton.Click += TakePicture;
  if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
  {
    if (CheckSelfPermission(storageReadPermission) == (int)Permission.Granted &&
    CheckSelfPermission(storageWritePermission) == (int)Permission.Granted)
    {
      if (IsThereAnAppToTakePicture())
      {
        CreateDirectoryForPictures();
      }                  
    }
    else
    {
      RequestPermissions(new string[] { storageWritePermission, storageReadPermission }, REQUEST_EXTERNAL_STORAGE);
    }
  }
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
  switch (requestCode)
  {
    case REQUEST_EXTERNAL_STORAGE:
    {
      if (grantResults[0] == Permission.Granted)
      {
        if (IsThereAnAppToTakePicture())
        {
          CreateDirectoryForPictures();
        }
      }
    }
    break;
    case REQUEST_CAMERA:
    {
      if (grantResults[0] == Permission.Granted)
      {
        StartCameraActivity();
      }
    }
  }
}
private void TakePicture(object sender, EventArgs e)
{
  if (Build.VERSION.SdkInt >= BuildVersionCodes.M) {
    if (CheckSelfPermission(cameraPermission) == (int)Permission.Granted &&
                    CheckSelfPermission(storageWritePermission) == (int)Permission.Granted)
    {
      StartCameraActivity();
    }
    else
    {
      RequestPermissions(new string[] { cameraPermission, storageWritePermission }, REQUEST_CAMERA);
    }
  }
  else
  {
    StartCameraActivity();
  }
}
const int REQUEST\u CAMERA=1;
const int REQUEST_EXTERNAL_STORAGE=2;
常量字符串cameraPermission=Android.Manifest.Permission.Camera;
常量字符串storageWritePermission=Android.Manifest.Permission.WriteExternalStorage;
const string storageReadPermission=Android.Manifest.Permission.ReadExternalStorage;
公共静态类应用程序
{
公共静态文件\u文件;
公共静态文件_dir;
公共静态位图;
公共静态字符串文件名;
}
私人书房在这里
{
意向意向=新意向(MediaStore.ActionImageCapture);
IList可用性=
PackageManager.QueryInputActivities(intent,PackageInfoFlags.MatchDefaultOnly);
return availableActivities!=null&&availableActivities.Count>0;
}
私有void CreateDirectoryForPictures()
{
App._dir=新文件(Enviroment.GetExternalStoragePublicDirectory(Enviroment.DirectoryPictures),“Kuponguru”);
如果(!App.\u dir.Exists())
{
App._dir.Mkdirs();
}
}
私有void StartCameraActivity()
{
意向意向=新意向(MediaStore.ActionImageCapture);
App.fileName=String.Format(“picture_{0}.jpg”,Guid.NewGuid());
App.\u file=新文件(App.\u dir,App.fileName);
intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App._文件));
StartActivityForResult(意图、请求和摄像头);
}
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.TakePicture);
pictureImageButton=FindViewById(Resource.Id.pictureButton);
pictureImageButton。单击+=拍摄照片;
如果(Build.VERSION.SdkInt>=BuildVersionCodes.M)
{
if(CheckSelfPermission(storageReadPermission)==(int)Permission.grated&&
CheckSelfPermission(storageWritePermission)==(int)权限。已授予)
{
如果(IsThehereAnapTopoTakePicture())
{
CreateDirectoryForPictures();
}                  
}
其他的
{
RequestPermissions(新字符串[]{storageWritePermission,storageReadPermission},请求\外部\存储);
}
}
}
public override void OnRequestPermissionsResult(int-requestCode,字符串[]权限,权限[]grantResults)
{
开关(请求代码)
{
案例请求\u外部\u存储:
{
if(grantResults[0]==权限.已授予)
{
如果(IsThehereAnapTopoTakePicture())
{
CreateDirectoryForPictures();
}
}
}
打破
案件请求/摄像机:
{
if(grantResults[0]==权限.已授予)
{
StartCameraActivity();
}
}
}
}
私有void TakePicture(对象发送方,事件参数e)
{
如果(Build.VERSION.SdkInt>=BuildVersionCodes.M){
if(CheckSelfPermission(cameraPermission)==(int)Permission.grated&&
CheckSelfPermission(storageWritePermission)==(int)权限。已授予)
{
StartCameraActivity();
}
其他的
{
RequestPermissions(新字符串[]{cameraPermission,storageWritePermission},REQUEST\u CAMERA);
}
}
其他的
{
StartCameraActivity();
}
}
如果我删除字符串intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App.\u文件));在StartCameraActivity中,相机工作,但使用此命令应用程序崩溃

谢谢你的建议

--更新--

我在intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App.u文件))中检查Uri.FromFile(App.u文件);文件不存在,所以问题是-应用程序无法创建文件(但可以创建目录)

--更新--

我在棉花糖模拟器上检查应用程序。一切正常。此外,我还检查了模拟设备-当我将照片发送到intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App._文件))中的相机活动时,相机应该保存照片的文件不存在;问题还在这里

--更新--


添加了相机活动开始和获取异常的尝试捕获file:///storage/emulated/0/Pictures/MyApp/picture_123.jpg 通过ClipData.Item.getUri暴露在应用程序之外至少我发现了什么问题。这是该死的版本问题。在Android N+中,没有更多的文件://URI,只有内容://URI。这就是为什么照相机活动不能与Uri.FromFile(App.\u文件)一起使用的原因。 对于这个解决方案,我必须感谢提问者和用户的请求,以及

该解决方案已更改为VS Xamarin,我使用:

**解决方案**

protected override void OnCreate(Bundle savedInstanceState){
  StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  StrictMode.SetVmPolicy(builder.Build());
  base.OnCreate(savedInstanceState);
  ...
}
其他代码没有更改

我在真实设备上的安卓N7.1.1上试用过,效果不错


感谢所有关注我问题的人。

至少我发现了问题所在。这是该死的版本问题。在Android N+中,没有更多的文件://URI,只有内容://URI。这就是为什么照相机活动不能与Uri.FromFile(App.\u文件)一起使用的原因。 对于这个解决方案,我必须感谢提问者和用户的请求,以及

该解决方案已更改为VS Xamarin,我使用:

**解决方案**

protected override void OnCreate(Bundle savedInstanceState){
  StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  StrictMode.SetVmPolicy(builder.Build());
  base.OnCreate(savedInstanceState);
  ...
}
其他代码没有更改

我在真实设备上的安卓N7.1.1上试用过,效果不错


感谢所有关注我问题的人。

你的代码是在模拟器中崩溃,还是在真实设备中崩溃,还是在两者中都崩溃?到@AndreKraemer-它在使用Android Marshmallow+的真实设备上崩溃。在带有KitKat和棒棒糖的真实设备上,一切正常。对于模拟,我使用VS emulator,只有KItKat。我认为这与权限to@JesusAngulo有关。好的,我在创建目录之前获得了WriteExternalStorage和ReadExternalStorage的权限,创建目录没有问题。文件也一样。在使用相机之前,我得到了相机许可。我签入设置-我的应用程序具有所有这些p