Java setDataSource()IO异常

Java setDataSource()IO异常,java,android,Java,Android,当使用MediaPlayer播放用户指定的mp3文件时,我遇到了一定的问题 try { mPlayer = new MediaPlayer(); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mPlayer.setDataSource(getApplicationContext(), audio); mPlayer.prepare(); mPlayer.

当使用MediaPlayer播放用户指定的mp3文件时,我遇到了一定的问题

try {
        mPlayer = new MediaPlayer();
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mPlayer.setDataSource(getApplicationContext(), audio);
        mPlayer.prepare();
        mPlayer.start(); }
        catch (IOException e) {
            numberText.setText("IO EXCEPTION");
            e.printStackTrace();
        }
问题出在mPlayer.setDataSource(getApplicationContext(),音频)中

在这里,我从用户那里获得指定的mp3

setAudio.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setType("audio/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent,1);


        }


        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

            if (requestCode == 1) {

                if (resultCode == RESULT_OK) {
                    audioPath = intent.getData().getPath();
                    audio = Uri.parse(audioPath);
                }
            }
        }


    });
错误日志显示了这一点

setDataSource: SecurityException! uri=content://com.android.providers.downloads.documents/document/1545
                                                                                  java.lang.SecurityException: Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{7b8354b 23595:com.example.m1tr0s0ul4s.thatawkwardcall/u0a137} (pid=23595, uid=10137) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
                                                                                      at android.os.Parcel.readException(Parcel.java:1540)
                                                                                      at android.os.Parcel.readException(Parcel.java:1493)
                                                                                      at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3372)
                                                                                      at android.app.ActivityThread.acquireProvider(ActivityThread.java:4819)
                                                                                      at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2527)
                                                                                      at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1486)
                                                                                      at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1092)
                                                                                      at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:932)
                                                                                      at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:859)
                                                                                      at android.media.MediaPlayer.setDataSource(MediaPlayer.java:987)
                                                                                      at android.media.MediaPlayer.setDataSource(MediaPlayer.java:961)
                                                                                      at com.example.m1tr0s0ul4s.thatawkwardcall.AcceptCall.onCreate(AcceptCall.java:55)
                                                                                      at android.app.Activity.performCreate(Activity.java:5966)
                                                                                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2408)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2517)
                                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:162)
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                      at android.os.Looper.loop(Looper.java:189)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5529)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
10-20 17:31:13.041 23595-23595/com.example.m1tr0s0ul4s.thatawkwardcall 
E/MediaPlayer: Unable to create media player

我完全不知道发生了什么:/please help

如果您已经请求运行时权限,请尝试以下代码:

if (Build.VERSION.SDK_INT < 19) {
   intent = new Intent();
   intent.setAction(Intent.ACTION_GET_CONTENT);
   intent.setType("*/*");
   startActivityForResult(intent, 1);
} else {
   intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
   intent.addCategory(Intent.CATEGORY_OPENABLE);
   intent.setType("*/*");
   startActivityForResult(intent, 1);
}
if(Build.VERSION.SDK\u INT<19){
intent=新intent();
intent.setAction(intent.ACTION\u GET\u CONTENT);
intent.setType(“*/*”);
startActivityForResult(意向,1);
}否则{
意向=新意向(意向.行动\打开\文件);
intent.addCategory(intent.CATEGORY\u可打开);
intent.setType(“*/*”);
startActivityForResult(意向,1);
}
如果您不是,那么您必须检查棉花糖和更高版本中的运行时权限。 将此代码添加到Manifest.xml

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

现在,在单击setAudio时,您需要检查用户是否授予您访问设备存储的权限

setAudio.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
               ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 11);

        }  else {
              //You already have the permission, just go ahead.
                 if (Build.VERSION.SDK_INT < 19) {
                      intent = new Intent();
                      intent.setAction(Intent.ACTION_GET_CONTENT);
                      intent.setType("*/*");
                      startActivityForResult(intent, 1);
                 } else {
                      intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                      intent.addCategory(Intent.CATEGORY_OPENABLE);
                      intent.setType("*/*");
                      startActivityForResult(intent, 1);
                 }
       }
}
setAudio.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(ActivityCompat.checkSelfPermission(MainActivity.this、Manifest.permission.READ\u EXTERNAL\u STORAGE)!=PackageManager.permission\u provided){
ActivityCompat.requestPermissions(MainActivity.this,新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE},11);
}否则{
//你已经得到许可了,继续吧。
如果(Build.VERSION.SDK_INT<19){
intent=新intent();
intent.setAction(intent.ACTION\u GET\u CONTENT);
intent.setType(“*/*”);
startActivityForResult(意向,1);
}否则{
意向=新意向(意向.行动\打开\文件);
intent.addCategory(intent.CATEGORY\u可打开);
intent.setType(“*/*”);
startActivityForResult(意向,1);
}
}
}
当您请求权限时,用户操作将在onRequestPermissionResult(…)中返回。以下是如何处理用户操作

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
   super.onRequestPermissionsResult(requestCode, permissions, grantResults);
   if (requestCode == 11) {
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
           //The External Storage READ Permission is granted to you... Continue your left job...
                 if (Build.VERSION.SDK_INT < 19) {
                      intent = new Intent();
                      intent.setAction(Intent.ACTION_GET_CONTENT);
                      intent.setType("*/*");
                      startActivityForResult(intent, 1);
                 } else {
                      intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                      intent.addCategory(Intent.CATEGORY_OPENABLE);
                      intent.setType("*/*");
                      startActivityForResult(intent, 1);
                 }
       } else{
           //permission denied
       }
}
@覆盖
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(requestCode==11){
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
//外部存储器读取权限已授予您…继续您的左作业。。。
如果(Build.VERSION.SDK_INT<19){
intent=新intent();
intent.setAction(intent.ACTION\u GET\u CONTENT);
intent.setType(“*/*”);
startActivityForResult(意向,1);
}否则{
意向=新意向(意向.行动\打开\文件);
intent.addCategory(intent.CATEGORY\u可打开);
intent.setType(“*/*”);
startActivityForResult(意向,1);
}
}否则{
//拒绝许可
}
}

intent.getData()
已经返回了一个
Uri
对象,因此您可能会丢弃读取特定文件所需的数据,如方案、主机或查询属性。

因此我只需执行audio=intent.getData()?您尝试过我回答中的第一段代码了吗?如果您正确放置了权限,那么您应该尝试下一步。这已经解决了它。谢谢。但是我的清单中已经有权限行,所以我不知道问题出在哪里。只是添加到清单对它没有帮助。您需要实时请求权限,或者进行更改用户转到“设置”并启用权限。此外,代码的第一部分与权限无关。
                audioPath = intent.getData().getPath();
                audio = Uri.parse(audioPath);