[英]App Crashes throwing an exception of permission denial:reading com.android.providers.media.MediaProvider
I am developing an app which needs permission to read and write External Storage.i have write all the permissions in Manifest file as well as also in my java activity file but my app still got crashed as soon as it starts with throwing an Exception of 我正在开发一个需要读取和写入External Storage权限的应用程序。我已经在清单文件以及Java活动文件中写入了所有权限,但是我的应用程序在抛出Exception异常开始后仍然崩溃
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>
Java File Java文件
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);
}
}
} }
Please help me to get out of this. 请帮助我摆脱困境。 Thanks in the anticipation. 谢谢您的期待。
Only do work when the permission is granted. 只有当权限授予做的工作。 Your code contains a logical error: 您的代码包含逻辑错误:
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // Mistake here.
getAllaudiofromdevice();
} //...
Also on API 23 your code will request permissions when they're not granted, but will do nothing(*) when they already are granted. 同样在API 23上,您的代码将在未授予权限时请求权限,但在已经授予权限时不执行任何操作(*)。 It should be like this: 应该是这样的:
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();
}
}
(*) Depending on how you call your code, it's really confusing. (*)取决于您如何调用代码,这确实令人困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.