GoodDay.Android FileProvider, приводящий к сбою камеры/галереи в случайном порядке
Используя помощь, полученную от руководства для разработчиков, я смог получить работу с фотографией моего приложения. Обычно эта операция включает в себя захват одного или нескольких изображений (что-то вроде приложения для создания фотогалереи коллажа). Он работает большую часть времени и на большинстве устройств, за исключением моего собственного устройства (Android 5.0.1). Проблема в том, что приложение камеры/галереи падает, давая мне ошибку отказа в разрешении безопасности в трассировке стека, и я искал решения и реализовал их, но безуспешно. Грохот, как правило, случайным образом, но более вероятно, произойдет, когда: 1. Я беру вторую фотографию 2. Мои настройки камеры находятся на самом высоком разрешении: 13 Мпикс (Едва ли когда-нибудь случается на низких разрешениях)
It но редко бывает в других случаях, но его появление сводит меня с ума. Вот мой код:
Фрагмент
private void dispatchTakePictureIntent(boolean isQuestionImage) {
Intent takePictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile(isQuestionImage);
} catch (IOException ex) {
Log.e("photofile part", "Error: "+ex);
}
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(getActivity(),
"com.operator.u_learn.fileprovider", photoFile);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
List<ResolveInfo> resolvedIntentActivities = getActivity()
.getPackageManager()
.queryIntentActivities(takePictureIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolvedIntentInfo : resolvedIntentActivities) {
String packageName = resolvedIntentInfo.activityInfo.packageName;
getActivity().grantUriPermission(packageName,
photoURI,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
if(isQuestionImage)
startActivityForResult(takePictureIntent, REQUEST_QUESTION_IMAGE_CAPTURE);
else
startActivityForResult(takePictureIntent, REQUEST_EXPLANATION_IMAGE_CAPTURE);
//revoke permissions after use
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
getActivity().revokeUriPermission(photoURI, Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
}
}
AndroidManifest.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.operator.u_learn.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-
data>
</provider>
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths
xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images"
path="Android/data/com.operator.u_learn/files/Pictures" />
</paths>
А вот ошибка я получаю
E/AndroidRuntime: FATAL EXCEPTION: main
Process:
com.android.gallery3d, PID: 18974
java.lang.SecurityException: Permission Denial: opening
provider android.support.v4.content.FileProvider from
ProcessRecord{3b596555 18974:com.android.gallery3d/u0a42}
(pid=18974, uid=10042) that is not exported from uid 10221
at
android.os.Parcel.readException(Parcel.java:1540)
at
android.os.Parcel.readException(Parcel.java:1493)
Мысль о том, чтобы использовать задержку, тоже пришла мне в голову, я попробую это, когда моя сила вернется. Но только для уточнения, где именно, следует ли разместить Thread.sleep? EDIT: даже когда я пытался игнорировать поставщик файлов и используя метод URI.fromFile, он все равно разбивался время от времени, но без сообщения об ошибке. Я попробую решение ASAP –
@ Mofe-hendyEjegi // перед вашей первой попыткой использовать 'Camera' api. – Youngjae
Приятно, очень полезно, я тестировал и больше не разбился. Но однажды это провалилось, поэтому я продолжу экспериментировать, спасибо. Я буду отмечать как ответ, как только я закончил тестирование. –