19

アプリには 2 つのアクティビティがあり、MainActivity は ImagePicker を呼び出します。これは、電話ギャラリーにすべての画像を配置する GridView を持ち、ContentResolver を使用してカーソルを取得します。

テストしたときは私の電話では問題なく動作しましたが、エミュレーターでは毎回即座にクラッシュしました。

エラーログは次のとおりです。

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5934, uid=10060 には android.permission.READ_EXTERNAL_STORAGE または grantUriPermission() が必要です

以下に示すように、マニフェストに許可が書かれています。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".ImagePicker" />
</application>
4

3 に答える 3

23

エミュレーターはどのバージョンの Android ですか? また、SDK 23 でコンパイルしていますか? エミュレーターが Marshmallow の場合、実行時にアクセス許可を明示的に確認する必要があります。これは、新しい権限モデルによるものです。

詳細については、アクセス許可に関するドキュメントをご覧ください: https://developer.android.com/training/permissions/index.html

于 2015-09-16T09:52:03.683 に答える
16

メソッドを呼び出す前に、権限を確認してください。

private void checkPermission(){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {     
         ActivityCompat.requestPermissions(         
    getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_EXTERNAL_STORAGE); 
    } else {    
         callMethod(); 
    }
}

許可結果を確認してください。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case Constants.WRITE_EXTERNAL_STORAGE:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    callMethod(); 
                }
                break;

            default:
                break;
        }
    }
于 2016-05-31T22:38:13.847 に答える