2016-04-15 3 views
2

Я пытаюсь получить доступ к mp3 файлы в externalStorage и это мой код:MediaStore разрешение отказано ошибка андроид

public class MainActivity extends AppCompatActivity { 
    private LinearLayout viewL; 
    private String[] STAR = { "*" }; 
    String fullpath; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     viewL = (LinearLayout) findViewById(R.id.linear); 

    try{ 

     String provider = "com.android.providers.media.MediaProvider"; 
     Uri uri = Uri.parse("content://media/external/audio/media"); 

     grantUriPermission(provider, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     grantUriPermission(provider, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     grantUriPermission(provider, uri, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 

     Cursor cursor; 
     Uri allsongsuri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     String selection = android.provider.MediaStore.Audio.Media.IS_MUSIC + " != 0"; 
     cursor = getContentResolver().query(allsongsuri, STAR, selection, null, null); 

     for(int i =0;i<1;i++){ 
      cursor.moveToFirst(); 
     fullpath = cursor.getString(cursor 
        .getColumnIndex(MediaStore.Audio.Media.DATA)); 
     } 
     MediaPlayer mp = new MediaPlayer(); 
     Uri myUri = Uri.parse(fullpath); 
    mp.setDataSource(this,myUri); 
     mp.prepare(); 
     mp.start(); 



    } 
     catch (Exception e){ 
      Snackbar.make(viewL,e.toString(),Snackbar.LENGTH_LONG).show(); 
     } 

    } 


} 

Это мой manifestFile:

<?xml version="1.0" encoding="utf-8"?> 
<manifest package="com.grassa" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> 
    <uses-permission android:name="android.permission.STORAGE" /> 
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> 


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

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

</manifest> 

Это мой LogCat:

Writing exception to parcel 
              java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=20241, uid=10113 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 
               at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
               at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
               at android.content.ContentProvider$Transport.query(ContentProvider.java:211) 
               at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 
               at android.os.Binder.execTransact(Binder.java:453) 

Как вы можете видеть, я добавил все необходимые разрешения, но все еще я получаю разрешение Отказано в ошибке Может кто-нибудь помочь мне с этим? ThankYou

ответ

1

Если вы используете его на зефире, вам необходимо запросить разрешение во время выполнения.

Вот официальный документ: http://developer.android.com/training/permissions/requesting.html

Вы должны проверить разрешение, используя ContextCompat.checkSelfPermission функцию. Тогда, если у вас нет разрешения,

запрос его через ActivityCompat.requestPermissions метод и реализовать

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) метод для получения результатов пользователей.

0

Если устройство работает под управлением Android 5.1 или ниже, или целевой SDK вашего приложения составляет 22 или ниже: если вы указываете опасное разрешение в манифесте, пользователь должен предоставить разрешение при установке приложения; если они не предоставляют разрешения, система вообще не устанавливает приложение.

Если устройство работает под управлением Android 6.0 или более поздней версии, а целевой SDK вашего приложения - 23 или выше: приложение должно отображать разрешения в манифесте и должно запрашивать каждое опасное разрешение, в котором оно нуждается, пока приложение работает. Пользователь может предоставлять или отклонять каждое разрешение, и приложение может продолжать работать с ограниченными возможностями, даже если пользователь отклоняет запрос на разрешение. использование ниже кода,

if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_CONTACTS)) { 

    // Show an expanation 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.READ_CONTACTS}, 
      MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS 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_READ_CONTACTS: { 
     // If request is cancelled, the result arrays are empty. 
     if (grantResults.length > 0 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      // permission was granted, yay! Do the 
      // contacts-related task you need to do. 

     } 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 
} 
} 

Источник: http://developer.android.com/training/permissions/requesting.html

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