2016-09-13 2 views
1

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) 

ответ

1

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

Возможно, самое высокое разрешение может привести к его возникновению чаще, поскольку для освобождения требуется больше времени.

Как вы знаете, в устройствах Android есть несколько различных реализаций среди производителей + аппаратное обеспечение + драйвер камеры + OS + комбинация приложений по умолчанию производителя. Некоторые разрешают доступ к камере api, автоматически отменяя предыдущее доступное приложение (LG Nexus 5), в то время как некоторые другие разбиваются (телефон LG G2).

Чтобы устранить эту проблему, если моя диагностика верна, я рекомендую вам добавить счетчик сна около Thread.sleep(500); перед ее запуском.

Or, try-catch Camera.open() способ. Он может дать RuntimeException, если он заблокирован другим процессором. Но, по моему опыту, Camera API очень ненадежный, поэтому заставляем нас обменивать коды try-catch почти на каждой строке команд api.

Хотя этот ответ не может быть решением для Галерея ошибка, но камера может быть.

+0

Мысль о том, чтобы использовать задержку, тоже пришла мне в голову, я попробую это, когда моя сила вернется. Но только для уточнения, где именно, следует ли разместить Thread.sleep? EDIT: даже когда я пытался игнорировать поставщик файлов и используя метод URI.fromFile, он все равно разбивался время от времени, но без сообщения об ошибке. Я попробую решение ASAP –

+0

@ Mofe-hendyEjegi // перед вашей первой попыткой использовать 'Camera' api. – Youngjae

+0

Приятно, очень полезно, я тестировал и больше не разбился. Но однажды это провалилось, поэтому я продолжу экспериментировать, спасибо. Я буду отмечать как ответ, как только я закончил тестирование. –

Смежные вопросы