当前位置: 首页 > 知识库问答 >
问题:

错误需要'Android.permission.read_external_storage'或grantUriPermission()[duplicate]

洪照
2023-03-14

这是我的logcat:

java.lang.runtimeException:无法启动活动ComponentInfo{com.example.murarilal.listview/com.example.murarilal.listview.mainactivity}:java.lang.securityException:权限拒绝:读取com.android.providers.media.mediaProvider uri内容://media/external/audio/media from pid=12518,uid=10087需要Android.Permission.read_external_storage或.app.activityThread.-Wrap12(activityThread.java),android.app.activityThread$h.handleMessage(activityThread.java:1460),android.os.handler.dispatchMessage(handler.java:102),android.os.handler.dispatchMessage(handler.java:154),android.os.looper.loop(handler.java:154),android.app.activityThread.main伊戈泰伊尼特.main(zygoteinit.java:756)由:java.lang.securityexception:权限拒绝:reading com.android.providers.media.media.provider uri content://media/external/audio/media from pid=12518,uid=10087需要Android.Permission.read_external_storage或grantUriPermission()在xy.query(contentProviderNative.java:421)在Android.content.contentResolver.query(contentResolver.java:530)在Android.content.contentResolver.query(contentResolver.java:472)在com.example.murarilal.listview.mainActivity.getMusic(mainActivity.java:57)在com.example.murarilal.listview.mainActivity.dostuff(mainActivity.java:77)在Android.app.instrumentation.callactivityoncreate(instrumentation.java:1118)在Android.app.activitythread.performLaunchActivity(activitythread.java:2599)在Android.app.activitythread.handleLaunchActivity(activitythread.java:2707) 在Android.app.activitythread.-Wrap12(activitythread.java) 在Android.app.activitythread$h.handleMessage(activitythread.java:1460) 在Android.os.handler.DispatchMessage(Handler.java:102) 在Android.os.looper.loop(looper.java:154) 在Android.app.activitythread.main(activitythread.java:6077) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:866) 在com.android.internal.os.zygoteinit.main(zygoteinit.java:756)

注意:我正在从SDCard读取文件。我认为错误是在getMusic()函数中游标。请帮我做这个。

MainActivity代码

public class MainActivity extends AppCompatActivity {

    private static final int MY_PERMISSION_REQUEST = 1;
    ArrayList<String> arrayList;
    ListView listView;
    ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_DENIED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_REQUEST);

            } else {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_REQUEST);

            }
        } else {
            doStuff();
        }

    }

    public void getMusic()
    {
        ContentResolver contentResolver=getContentResolver();
        Uri songUri =MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor songCursor=contentResolver.query(songUri,null,null,null,null);
        {
            if(songCursor!=null && songCursor.moveToFirst())
            {
                int songTitle=songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
                int songArtist=songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
                do{
                    String currentTitle=songCursor.getString(songTitle);
                    String currentArtist=songCursor.getString(songArtist);
                    arrayList.add(currentTitle +"\n"+currentArtist);

                }while (songCursor.moveToFirst());

            }
        }
    }

    public void doStuff() {
        listView = (ListView) findViewById(R.id.listView);
        arrayList = new ArrayList<>();
        getMusic();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,arrayList);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            }
        });


    }



    @Override
    public void onRequestPermissionsResult ( int requestCode, String[] permissions,int[] grantResults){
        switch (requestCode) {
            case MY_PERMISSION_REQUEST:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    {
                        if (ContextCompat.checkSelfPermission(MainActivity.this,
                                Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_DENIED) {
                            Toast.makeText(this, "permission granted", Toast.LENGTH_LONG).show();
                            doStuff();
                        } else {
                            Toast.makeText(this, "no permission granted", Toast.LENGTH_LONG).show();
                            finish();
                        }

                    }
                    return;
                }
        }
    }



}

任何帮助都将不胜感激,谢谢。

共有1个答案

蔚丰
2023-03-14

你的问题是:

您正在检查权限是否被拒绝而不是请求权限,是否被拒绝而不是dostufle(),这与您想要做的完全相反。

您应该检查它是否被授予请求权限,以及是否被授予dostuff()

如果条件为:

if (ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_DENIED)
if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
 类似资料:
  • 我一直在尝试解决一个问题与共享映像从外部存储目录。它在大多数设备中起作用,但在其他设备中不起作用。我有:1。添加了扩展FileProvider的类: 我的共享映像功能在下面: 我将感谢你的帮助

  • 如有任何帮助,我们将不胜感激。

  • 请看一下这段代码。最后一行出现了一个错误,因为我传递的是一个“索引”而不是一个资源。我以为是皮毛的问题,试图压制它。然后我注意到只有在构建发布时才会出现这个错误。它在构建调试时工作良好。我完全一无所知。谁能告诉我我做错了什么。

  • 我得到了 错误:Route.Get()需要一个回调函数,但得到了一个[object Undefined] 这是我的路由文件: 错误日志: 错误:route.get()需要回调函数,但在route.(anonymous function)[as get](C:\users\PAI\DesktoP\mean\node_modules\express\lib\router\route.js:202:15

  • 我得到以下错误: 警告:需要\u一次(C:\xampp\htdocs\mvc\public\views\home\init.php):无法打开流:C:\xampp\htdocs\mvc\public\index中没有此类文件或目录。php在线3 致命错误:require_once():无法打开所需的“C:\xampp\htdocs\mvc\public\views\home\init”。在C:\x