【发布时间】:2017-06-08 11:13:52
【问题描述】:
各位程序员大家好。
在 Visual Studio 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();
}
}
如果我删除字符串 intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App._file));在 StartCameraActivity 中,然后相机可以工作,但是使用此命令应用程序崩溃了。
我将不胜感激所有建议。
--已更新--
我检查 Uri.FromFile(App._file) in intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App._file));文件不存在所以,问题是 - 应用程序无法创建文件(但可以创建目录)
--已更新--
我在 Marshmallow 模拟器上检查应用程序。一切正常。我还检查了模拟设备-当我将其发送到intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App._file))中的相机活动时,相机应该保存照片的文件不存在;那么问题还是在这里。
--已更新--
为相机活动添加尝试捕获并获取异常文件:///storage/emulated/0/Pictures/MyApp/picture_123.jpg 通过 ClipData.Item.getUri 暴露在应用之外
【问题讨论】:
-
您的代码是在模拟器、真实设备还是两者中都崩溃?
-
致@AndreKraemer - 它在装有 Android Marshmallow+ 的真实设备上崩溃。在带有 KitKat 和 Lollipop 的真实设备上,一切正常。对于模拟,我使用 VS 模拟器,并且只有 KItKat。
-
我觉得和权限有关
-
致@JesusAngulo 好吧,我在创建目录之前获得了WriteExternalStorage 和ReadExternalStorage 权限,并且它的创建没有问题。与文件相同。在使用相机之前,我获得了相机许可。我签入设置 - 我的应用程序拥有所有这些权限。相机活动有问题。
-
我建议您使用 Android Device Monitor 来获取更多详细信息。
标签: android visual-studio xamarin camera