2017-07-09 4 views
1

私はExternal Storage.iを読み書きする権限を必要とするアプリケーションを開発しています。マニフェストファイルにすべての権限を書き込んでいるだけでなく、それはAppアクセス拒否の例外をスローするクラッシュ:com.android.providers.media.MediaProviderを読む

permission denial:reading com.android.providers.media.MediaProvider

Manifest File

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

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:exported="true" 
     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> 
    <activity 
     android:name=".Fragment_one" 
     android:label="Fragment_one" 
     android:theme="@style/AppTheme.NoActionBar" /> 
    <activity 
     android:name=".Fragment_two" 
     android:label="@string/title_activity_fragment_two" 
     android:theme="@style/AppTheme.NoActionBar" /> 
    <activity 
     android:name=".Fragment_three" 
     android:label="@string/title_activity_fragment_three" 
     android:theme="@style/AppTheme.NoActionBar"></activity> 
</application> 

0の例外を投げると を起動すると、私のJavaアクティビティファイルではなく、私のアプリはまだ、すぐにクラッシュしてしまいました

Java File

public class Fragment_two extends Fragment { 
private RecyclerView recyclerView2; 
private List<Model1> modelList; 
private myAdapter2 adapter; 
private MenuItem menu; 


public Fragment_two() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_fragment_two, container, false); 
    ; 
    recyclerView2 = (RecyclerView) view.findViewById(R.id.recycle2); 
    int No_of_coloumns = 3; 
    recyclerView2.setLayoutManager(new GridLayoutManager(getContext(), No_of_coloumns)); 
    modelList = getAllaudiofromdevice(); 
    adapter = new myAdapter2(modelList, (ViewGroup) view); 
    recyclerView2.setAdapter(adapter); 
    return view; 
} 

public List<Model1> getAllaudiofromdevice() { 
    List<Model1> files = new ArrayList<>(); 
    try { 
     ContentResolver contentResolver = getContext().getContentResolver(); 
     String selection = MediaStore.Audio.Media.IS_MUSIC; 
     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     String[] projection = {MediaStore.Audio.AudioColumns.DATA, MediaStore.Audio.AudioColumns.ALBUM, MediaStore.Audio.AudioColumns.ARTIST}; 
     Cursor c = contentResolver.query(uri, null, selection, null, null); 
     if (c != null) { 
      while (c.moveToNext()) { 
       Model1 model1 = new Model1(); 
       String path = c.getString(0); 
       String album = c.getString(1); 
       String artist = c.getString(2); 
       String name = path.substring(path.lastIndexOf('/') + 1); 
       model1.setName(name); 
       model1.setArtist(artist); 
       model1.setAlbum(album); 
       model1.setPath(path); 
       files.add(model1); 
      } 
      c.close(); 
     } 
    } catch (Exception e) { 
     throw e; 
    } 
    check(); 
    return files; 
} 

public void check() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123); 
      return; 
     } 
    } else { 
     getAllaudiofromdevice(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestcode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestcode) { 
     case 123: 
      if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
       getAllaudiofromdevice(); 
      } else { 
       Toast.makeText(getContext(), "you have to set permissions", Toast.LENGTH_SHORT).show(); 
       check(); 
      } 
     default: 
      super.onRequestPermissionsResult(requestcode, permissions, grantResults); 
    } 

} 

}

私はこのから抜け出すために助けてください。 予感に感謝します。

+1

質問を編集し、Javaスタックトレース全体を投稿してください。 – CommonsWare

+0

実行時に 'WRITE_EXTERNAL_STORAGE'が許可されているように見えますが、エラー –

+0

@ cricket_007によると読み取りは許可されていません。権限グループの権限を求めるとき、そのグループからすべての権限が与えられます。それは、それが今までマーシュマロー以来どのように働いていたかです。 –

答えて

0

の許可がの場合にのみ動作します。

if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // Mistake here. 
    getAllaudiofromdevice(); 
} //... 

はまた、API 23にあなたのコードは、彼らが許可されていないときのパーミッションを要求しますが、彼らがすでに付与されているときは何も(*)を行いません:あなたのコードは、論理的な誤りが含まれています。

public void check() { 
    if (Build.VERSION.SDK_INT >= 23 && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     // Request permissions if they're not granted on API 23. 
     requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123); 
    } else { 
     // Do work on API <23 and when permissions were granted on API 23+. 
     getAllaudiofromdevice(); 
    } 
} 

(*)コードをどのように呼び出すかによって、実際には混乱します。

関連する問題