Android MediaPlayer无法设置setDataSource uri

时间:2018-05-03 19:43:51

标签: java android android-mediaplayer

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

  

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

     

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 failed:status = 0x80000000

我没办法,我需要android.permission.MANAGE_DOCUMENTS,我的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方法中运行它(这似乎是一个坏主意)并通过另一种方法在按钮点击时调用,都失败了。

请注意,如果我启动应用程序并通过启动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))替换也没有问题。

1 个答案:

答案 0 :(得分:0)

您无法保留Uri值并希望它稍后有效。那些拥有content计划offer you access to the content for a very short time的人。

如果您使用ACTION_OPEN_DOCUMENT来获取Uri,则可以请求对内容via takePersistableUriPermission() on a ContentResolver进行长期访问。但是,您仍然需要处理用户移动或删除内容的可能性。

如果您使用ACTION_GET_CONTENT来获取Uri,请切换到ACTION_OPEN_DOCUMENT(如果您的minSdkVersion为19或更高)或制作内容的副本,然后使用你的副本。