Intereting Posts
Получение данных с веб-сайта в приложении для Android Закрыть приложение для Android Swipeleft для удаления не работает в расширяемом представлении высоты Ручная установка обновленного АПК завершается неудачей: «Подписи не соответствуют ранее установленной версии», Android: получить Viewgroup с точки зрения? Amazon Appstore DRM – Как реализовать? Показать время, когда песня играет в android Как сделать форму с левым верхним округлым углом и левым нижним закругленным углом? Android Force GPU Rendering Как включить или отключить? Recyclerview внутри вложенного просмотра прокрутки, загружая все данные вместо вызова по одному изображению при прокрутке Расширяемое уведомление Firebase Показать изображение, когда приложение находится в фоновом режиме Пример потокового видео для Android File: /// android_res / drawable не работает при использовании аромата с другим именем пакета Как получить FusedLocation из IntentService Рассчитайте угол касания и поверните его в Android

FileProvider не работает с камерой

Я пытаюсь сделать приложение камеры для хранения вывода на моем внутреннем хранилище. Я также понимаю, что сторонние приложения не могут получить доступ к внутреннему хранилищу моего приложения, но мы можем это сделать, разоблачая внутренний каталог через FileProvider . Я следовал за проводником здесь:

  • Намерение камеры не сохраняет фото
  • https://developer.android.com/reference/android/support/v4/content/FileProvider.html

Я указываю свой AndroidManifest.xml следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.stackoverflow.test.camerawithfileprovider" > <application> <activity ... </activity> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.stackoverflow.test.camerawithfileprovider.fileprovider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_path" /> </provider> </application> </manifest> 

Я создал файл xml с именем file_provider_path.xml в /res/xml/ :

 <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="image_capture" path="public/" /> </paths> 

Вот как я создаю и называю намерение камеры:

 private static final int CAMERA_REQUEST_CODE = 5000; private static final String CAMERA_FP_AUTHORITY = "com.stackoverflow.test.camerawithfileprovider.fileprovider"; Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); Context context = MainActivity.this; File imagePath = new File(context.getFilesDir(), "public"); if (!imagePath.exists()) imagePath.mkdirs(); File newFile = new File(imagePath, "tmp.jpg"); Uri imageUri = FileProvider.getUriForFile(context, CAMERA_FP_AUTHORITY, newFile); //context.grantUriPermission("com.google.android.GoogleCamera", imageUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); Log.d("YouQi", "Image URI Passing to Camera: " + imageUri.toString()); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, CAMERA_REQUEST_CODE); 

Когда я запускаю приложение, я могу получить результат ниже Logcat:

  11-11 20:07:39.581 18303-18303/com.stackoverflow.test.camerawithfileprovider D/YouQi: Image URI Passing to Camera: content://com.stackoverflow.test.camerawithfileprovider.fileprovider/image_capture/tmp.jpg 

В тот момент, когда камера закрывается, я нажимаю ниже Исключение:

 com.google.android.GoogleCamera E/AndroidRuntime: FATAL EXCEPTION: main com.google.android.GoogleCamera E/AndroidRuntime: Process: com.google.android.GoogleCamera, PID: 19420 com.google.android.GoogleCamera E/AndroidRuntime: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{42e44f70 19420:com.google.android.GoogleCamera/u0a83} (pid=19420, uid=10083) that is not exported from uid 10312 com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1465) com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1419) com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2882) com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ActivityThread.acquireProvider(ActivityThread.java:4544) com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2274) com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425) com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:906) com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.openOutputStream(ContentResolver.java:669) com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.openOutputStream(ContentResolver.java:645) com.google.android.GoogleCamera E/AndroidRuntime: at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1281) com.google.android.GoogleCamera E/AndroidRuntime: at com.android.camera.PhotoModule$8.onClick(PhotoModule.java:593) com.google.android.GoogleCamera E/AndroidRuntime: at android.view.View.performClick(View.java:4445) com.google.android.GoogleCamera E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:18446) com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733) com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136) com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5146) com.google.android.GoogleCamera E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) com.google.android.GoogleCamera E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515) com.google.android.GoogleCamera E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) com.google.android.GoogleCamera E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) com.google.android.GoogleCamera E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method) 

Может ли кто-нибудь помочь объяснить, почему проблема происходит? Я создал образец проекта моей проблемы: http://www.axzae.com/downloads/CameraWithFileProvider.zip

В любом случае, приложение будет работать, если я четко укажу:

 context.grantUriPermission( "com.google.android.GoogleCamera", imageUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION ); 

Но это будет работать только для устройств nexus / cyanogen. Приложение Samsung для камеры может использовать другое имя пакета.

Solutions Collecting From Web of "FileProvider не работает с камерой"

  1. Пожалуйста, не пытайтесь поставить pskink exported="true" как указано pskink , ваше приложение выйдет из pskink в момент его загрузки. FileProvider не предназначен для работы в этом состоянии.

  2. Попробовал решение CommonsWare от CommonsWare . Не работает. Вероятно, будет работать только с намерением ACTION_SEND .

  3. Я нашел ответ в этом посте . По-видимому, единственным способом является путь предоставления руководства. Но мы всегда можем зацикливаться на список пакетов-кандидатов и grantPermission на все из них.

     List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } 

У меня была аналогичная проблема, но позже я обнаружил, что у меня есть опечатка. Опечатка была в AndroidManifest.xml, точно в тег в строке «полномочия».

Для меня,

 android:authorities="com.stackoverflow.test.camerawithfileprovider.fileprovider" 

Не работает (когда я вызываю экземпляр камеры, приложение падает), но если я удалю «файл» и заменю эту строку следующим образом:

 android:authorities="com.stackoverflow.test.camerawithfileprovider.provider" 

Мое приложение работает плавно (приложение снимает фотографию, сохраняет ее и возвращает предварительный просмотр активности в клиентском приложении).

У вашего приложения также есть такая же проблема?