46

java.lang.SecurityException: Permission Denial: プロバイダー com.android.providers.media.MediaDocumentsProvider を ProcessRecord{430b1748 29271:com.xxx/u0a88} (pid=29271, uid=10088) から開くには、android.permission.MANAGE_DOCUMENTS または android が必要です。パーミッション.MANAGE_DOCUMENTS

権限を追加しましたが、MANAGE_DOCUMENTSまだREAD_EXTERNAL_STORAGEこのエラーが発生します。問題のコード:

 public static String getImagePath(HailoDriverApplication app, Uri uri) {
    Cursor cursor = null;
    if (uri == null) {
        return null;
    }
    try {
        cursor = app.getContentResolver().query(uri, new String[] {
            MediaStore.Images.Media.DATA
        }, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        if (cursor.moveToFirst()) {
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return null;
}

マニフェストの要求されたスニペットとして:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.x.x.x" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission
    android:name="android.permission.UPDATE_DEVICE_STATS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.intent.action.BATTERY_CHANGED" />
<uses-permission
    android:name="android.permission.INSTALL_PACKAGES"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
4

6 に答える 6

44

過去数日間、同じ問題がありました。いくつかの解決策を試しましたが、何らかの理由で、マニフェストに android.permission.MANAGE_DOCUMENTS 権限を追加した場合でも、一部の画像に対して Uri コンテンツ プロバイダーで権限が拒否されました。

当面の回避策は次のとおりです。

i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, CHOOSE_IMAGE);

これにより、新しい Kitkat ドキュメント ビューではなく、古いイメージ ギャラリーが強制的に開かれます。

これで、onActivityResult で次を呼び出して Uri を取得できます。

Uri selectedImageURI = data.getData();

お役に立てれば。

于 2013-11-25T07:31:13.033 に答える
12

OK、私は問題を乗り越える実用的なサンプルを見つけました:

            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");
            startActivityForResult(intent, myClassConstant.SELECT_PICTURE);

これが私が学んだことです...これはKitKatの変更であり、このコードはAPI 19以降でのみ機能します。古いバージョンでは機能しないため、KitKat 以前のメソッドも必要です。Category_Openable 引数を使用してファイル (私の場合は画像) を取得したら、それを URI として参照することで使用できます。私の場合、URIString (ファイル パス) を保存し、開いた後に必要なことを行うことができます。

私が今理解しようとしている問題は、ファイルのアクセス許可が持続する期間です。私のコードが UriString を探してからファイルを開こうとするため、昨日から有効期限が切れているようです。上記のコードを使用して画像を選択すると、機能します-名前が保存され、プログラムを終了して戻っても機能しました...しかし、今朝の最初のプログラムの実行(後) 12時間以上触れていない場合)、ファイルが見つからないように動作しました(デバッガーを監視すると、重大ではないエラーが再び表示されると確信しています.

では、問題は次のとおりです。ファイル (名前) が何であるかがわかったら、どのようにアクセス許可を保持しますか?

于 2014-08-12T15:46:16.837 に答える
3

パーミッションはMANAGE_DOCUMENTSシステムによってのみ保持されます:

MANAGE_DOCUMENTS 権限。デフォルトでは、プロバイダーは誰でも利用できます。このアクセス許可を追加すると、プロバイダーがシステムに制限されます。この制限は、セキュリティ上重要です。

( Storage Access Frameworkから取得)

したがって、このアクセス許可を使用するDocumentProviderことで、プロバイダーへのアクセスをシステムのみに制限することになります。これが意味することは、 のみがSystem UI pickerファイルにアクセスできるということです。したがって、アプリがファイルからファイルを選択するには、 withProviderを起動する必要があります。これにより、実際には が起動されます。ユーザーはそこからファイルを選択し、が返されます。IntentACTION_OPEN_DOCUMENTSystem UI pickerURI

于 2014-03-18T10:39:52.113 に答える