![](/img/trans.png)
[英]android start camera activity on application launch or while brought to frontr
[英]Android application crashes while launch camera activity (Visual studio Xamarin)
您好所有程序员。
在Visual Studio Xamarin中创建我的第一个android应用程序时,我遇到了另一个问题(其中有很多=))。 我尝试对Android Marshmallow +进行权限检查。 当我尝试启动Camera Activity(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中,相机可以工作,但是此命令应用程序崩溃了。
所有建议将不胜感激。
- 更新 -
我在intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App._file))中检查Uri.FromFile(App._file); 文件不存在因此,问题是-应用无法创建文件(但可以创建目录)
- 更新 -
我检查了棉花糖模拟器上的应用程序。 一切正常。 我也检查了模拟设备-当我将其发送到intent.PutExtra(MediaStore.ExtraOutput,Uri.FromFile(App._file))的Camera活动中时,相机应该保存照片的文件不存在。 问题仍然存在。
- 更新 -
添加了尝试相机活动的尝试捕获并获取异常文件:///storage/emulated/0/Pictures/MyApp/picture_123.jpg通过ClipData.Item.getUri在应用程序之外公开
至少我发现出了什么问题。 这是该死的版本问题。 在Android N +中,不再有file:// URI,只有content:// URI。 这就是为什么Camera Activity无法与Uri.FromFile(App._file)一起使用的原因。 对于此解决方案,我必须感谢请求提问者SuperThomasLab和用户Pkosta , hqzxzwb和Java编码器的 回答
我使用的解决方案针对VS Xamarin进行了更改:
**解决方案**
protected override void OnCreate(Bundle savedInstanceState){
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.SetVmPolicy(builder.Build());
base.OnCreate(savedInstanceState);
...
}
其他代码不变。
我在真实设备上的Android N 7.1.1上尝试了它,并且可以正常工作。
感谢所有关注我的问题的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.