简体   繁体   English

应用程序崩溃引发权限拒绝异常:读取com.android.providers.media.MediaProvider

[英]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.

相关问题 权限拒绝:重新启动应用程序时打开提供程序 com.android.providers.media.MediaDocumentsProvider - Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider when RESTARTING the app 应用随机崩溃,显示权限被拒绝 - App crashes randomly ,show's permission denial exception 权限拒绝:打开提供程序 com.android.providers.contacts.ContactsProvider2 Read_Contacts 并且我没有写权限 - Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 Read_Contacts and I don't have a write permission 我的应用因拒绝权限而崩溃 - My App Crashes because of permission denial 应用程序因 Permission Denial 崩溃:不允许发送广播 android.intent.action.SCREEN_ON - App crashes with Permission Denial: not allowed to send broadcast android.intent.action.SCREEN_ON 安全异常:权限被拒绝 - Security Exception: Permission Denial 应用程序崩溃,并出现java.lang.SecurityException:权限被拒绝 - App crashes with java.lang.SecurityException: Permission Denial Android:自定义Parcelable类在没有抛出异常的情况下崩溃应用程序 - Android: Custom Parcelable Class Crashes App Without Throwing Exception Android Studio权限拒绝 - Android Studio Permission Denial android 工作室中的权限拒绝 - permission denial in android studio
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM