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