Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android MediaPlayer无法设置数据源uri_Java_Android_Android Mediaplayer - Fatal编程技术网

Java Android MediaPlayer无法设置数据源uri

Java Android MediaPlayer无法设置数据源uri,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,我正在尝试使用SharedReferences存储以前播放的歌曲的uri。但是,如果为了播放歌曲而提取并重建uri,我会收到以下错误消息: 05-03 20:43:14.642 8617-8716/com.stopwatch.app W/MediaPlayer:无法在客户端打开文件;正在尝试服务器端:java.lang.SecurityException:权限拒绝:从ProcessRecord{2c95b0 8617:com.stopwatch.app/u0a175}(pid=8617,uid=

我正在尝试使用SharedReferences存储以前播放的歌曲的uri。但是,如果为了播放歌曲而提取并重建uri,我会收到以下错误消息:

05-03 20:43:14.642 8617-8716/com.stopwatch.app W/MediaPlayer:无法在客户端打开文件;正在尝试服务器端:java.lang.SecurityException:权限拒绝:从ProcessRecord{2c95b0 8617:com.stopwatch.app/u0a175}(pid=8617,uid=10175)打开提供程序com.android.providers.media.mediaDocuments提供程序需要android.Permission.MANAGE_文档或android.Permission.MANAGE_文档

05-03 20:43:14.658 8617-8716/com.stopwatch.app I/MediaPlayer:setDataSource(content://com.android.providers.media.documents/document/audio%3A18504)

05-03 20:43:14.661 8617-8716/com.stopwatch.app E/MediaPlayer:无法创建媒体播放器

05-03 20:43:14.662 8617-8716/com.stopwatch.app W/System.err:java.io.IOException:setDataSource失败:状态=0x8000000

我不明白我需要android.permission.MANAGE_文档的方式,我的IDE告诉我这是一个只适合系统应用程序的权限。我的代码如下所示:

if(prefs.contains("AudioFile")){
        try {
            String UriString = prefs.getString("AudioFile", null);
            Uri uri = Uri.parse(UriString);
            mediaPlayer.setDataSource(this, uri);
            Gdx.app.log("Android Media Player", "Successfully got data");
        } catch (IOException e) {
            e.printStackTrace();
            Gdx.app.log("Android Media Player", e.getMessage());
        }
        try {
            mediaPlayer.prepare();
            Gdx.app.log("Android Media Player", "Successfully prepared content");
        } catch (IOException e) {
            e.printStackTrace();
            Gdx.app.log("Android Media Player", e.getMessage());
        }
    }
我试着用
onCreate
方法(这似乎是个坏主意)运行它,并通过另一个方法(点击按钮调用)运行它,但都失败了

请注意,如果我启动应用程序并通过intent在启动mediaPlayer时检索uri,请执行以下操作:

protected void onActivityResult (int requestCode, int resultCode, Intent data){
    if(requestCode == MUSIC_REQUEST){
        if(resultCode == RESULT_OK){
            Uri myUri = data.getData();
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("AudioFile", myUri.toString());
            editor.commit();
            System.out.println(myUri);
            try {
                mediaPlayer.setDataSource(this, myUri);
                Gdx.app.log("Android Media Player", "Succesfully got data");
            } catch (IOException e) {
                e.printStackTrace();
                Gdx.app.log("Android Media Player", e.getMessage());
            }
            try {
                mediaPlayer.prepare();
                Gdx.app.log("Android Media Player", "Succesfully prepared content");
            } catch (IOException e) {
                e.printStackTrace();
                Gdx.app.log("Android Media Player", e.getMessage());
            }
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

我没有问题,即使我用mediaPlayer.setDataSource(这个,Uri.parse(myUri.toString))替换也没有问题

您不能持久化
Uri
值,并期望它以后工作。具有
内容
方案的

如果您使用
ACTION\u OPEN\u DOCUMENT
获取您的
Uri
,您可以请求长期访问内容。不过,您仍然需要处理用户可能移动或删除内容的可能性

如果您正在使用
ACTION\u GET\u CONTENT
获取您的
Uri
,请切换到
ACTION\u OPEN\u DOCUMENT
(如果您的
minSdkVersion
为19或更高版本)或复制内容,然后使用您的副本