2017-01-07 2 views
-1

Моего manifest.xml как это:Weird Разрешения Отрицание исключения (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> 

Как вы можете видеть, у меня есть:

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

Но когда я нажимаю кнопку в моем приложении, которое вызывает следующий код:

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 Вы пытаетесь запустить приложение ur на Android 6 или выше? –

+0

Да, я пытаюсь запустить на Android 6 –

ответ

1

понизить с targetSdkVersion 24 до targetSdkVersion 22 или добавить разрешение программного обеспечения. см. official doc

+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

В вашем коде при показе объяснений почему 'Показать объяснения пользователю * асинхронно *? Если я просто открою диалоговое окно, чтобы объяснить пользователю, почему требуется разрешение, почему мне нужно всплывать диалоговое окно асинхронно? Это не долгое время. Я проверил также официальный документ, он говорит то же самое, мне интересно, я должен следовать этому? –

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