2017-01-07 13 views
-1

マイmanifest.xmlには、このようなものです:奇妙なパーミッション拒否の例外(WRITE_EXTERNAL_STORAGE)

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

しかし、私は私のアプリでボタンを押したときに:あなたは、私が持って見ることができるように

<?xml version="1.0" encoding="utf-8"?> 
<manifest package="com.my.app" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 

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

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

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

</manifest> 

私は例外を以下しまった

MediaStore.Images.Media.insertImage(
    getContentResolver(), myView.getDrawingCache(), 
    UUID.randomUUID().toString()+".png", "my pic"); 

次のコードをトリガー

Failed to insert image 
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2574, uid=11336 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission() 
                     at android.os.Parcel.readException(Parcel.java:1627) 

なぜですか? AndroidManifestファイルに定義されている権限があります。

+0

rあなたはAndroid 6以上でurアプリを実行しようとしていますか? –

+0

はい、Android 6で実行しようとしています –

答えて

1

ダウングレードtargetSdkVersion 24からtargetSdkVersion 22へのアクセス許可またはプログラムによる許可を追加します。​​

+0

targetSdkVersionを23よりも低く変更しても同じエラーが発生しました。(私はtargetSdkVersion 17を使用します) –

0

Android 6.0から、アクセス許可はインストール前ではなく実行時に要求されます。

さて、あなたは(あなたの場合には、外部記憶装置上のファイルの書き込み)許可が必要なものを実行する必要がある場合は、あなたがこれを行う必要があります:次に

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission. WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
     // Show an explanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 
    } else { 
     // No explanation needed, we can request the permission. 
     ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); 

     // MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

を、オーバーライド ``参照するにはユーザーが許可を与えているかどうかを確認します。

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // permission was granted, yay! 
      } else { 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

新しいアクセス許可モデルhereについて詳しく知ることができます。

+0

あなたのコードで説明を表示すると、非同期に* '?私は、ダイアログボックスをポップアップして、なぜパーミッションが必要なのかをユーザに説明するだけで、なぜ非同期にダイアログをポップアップする必要があるのですか?それは長期的なものではありません。私は公式文書もチェックした、それは同じ、私はそれに従わなければならないと思いますか? –

関連する問題