Подтвердить что ты не робот

Java.lang.SecurityException: отказ от разрешения: открытие провайдера com.google.android.apps.photos.content.GooglePhotosImageProvider

Внезапно я начал получать следующее исключение от устройств, работающих под управлением Android 4.3 и выше

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.content.GooglePhotosImageProvider from ProcessRecord{454ca9d0 5914:com.propertymanager/u0a10231} (pid=5914, uid=10231) requires com.google.android.apps.photos.permission.GOOGLE_PHOTOS or com.google.android.apps.photos.permission.GOOGLE_PHOTOS
        at android.os.Parcel.readException(Parcel.java:1431)
        at android.os.Parcel.readException(Parcel.java:1385)
        at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2896)
        at android.app.ActivityThread.acquireProvider(ActivityThread.java:4755)
        at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2480)
        at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1152)
        at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:759)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:665)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:500)
        at com.myapp.xxxx.determineCorrectScale(SourceFile:148)

My Код, вызывающий его,

    public static int determineCorrectScale(Context con, Uri imagUri) {
        int scale = 1;
        InputStream imageStream = null;

                imageStream = con.getContentResolver().openInputStream(imagUri);
.
.
.
    }

Любая помощь?

EDIT: Так я позволяю пользователю выбрать изображение перед вызовом вышеуказанного метода

Intent choosePictureIntent = new Intent(Intent.ACTION_PICK, Images.Media.INTERNAL_CONTENT_URI);
tartActivityForResult(choosePictureIntent, REQUEST_CHOOSE_IMAGE);

Вот он: OnActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
        case REQUEST_CHOOSE_IMAGE:

            Uri selectedImage = intent.getData();

            try {

                int scale = CommonFunc.determineCorrectScale(this, selectedImage);
4b9b3361

Ответ 1

вам нужно добавить это разрешение в свой манифест:

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

надеюсь, что это сработает для вас. пожалуйста, дайте мне обратную связь

Ответ 2

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

"Окончательное" решение этой проблемы можно найти здесь:

Получение доступа с временными разрешениями

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

http://developer.android.com/guide/topics/providers/content-provider-basics.html

Так как версия 4.3 Android проверяет, продолжает ли выполняющая операция приема, и если не выбрасывает SecurityException. Метод определенияCorrectScale является статическим методом, поэтому я предполагаю, что он по крайней мере иногда вызывается вне жизненного цикла Activity. Чтобы исправить это раз и навсегда, вам необходимо получить данные от поставщика контента во время работы Activity. Я не знаю требований к вашему приложению, но если нет тяжелой работы (например, копирование изображений из поставщика контента), просто сделайте это на нити ui. Если требуется тяжелая работа, используйте AsyncTask, запущенный Activity, но затем вы должны убедиться, что Activity не завершит работу до того, как данные были извлечены (что может быть сложно).

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