Android MediaPlayer 无法设置数据源 uri

Posted

技术标签:

【中文标题】Android MediaPlayer 无法设置数据源 uri【英文标题】:Android MediaPlayer unable to setDataSource uri 【发布时间】:2018-10-14 05:22:25 【问题描述】:

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

05-03 20:43:14.642 8617-8716/com.stopwatch.app W/MediaPlayer:无法在客户端打开文件;尝试服务器端:java.lang.SecurityException:权限拒绝:从 ProcessRecord2c95b0 8617:com.stopwatch.app/u0a175(pid=8617,uid=10175)打开提供程序 com.android.providers.media.MediaDocumentsProvider 需要 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 方法(这似乎是个坏主意)和通过单击按钮调用的另一种方法来运行它,但都失败了。

请注意,如果我启动应用程序并通过 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(this, Uri.parse(myUri.toString)) 代替。

【问题讨论】:

【参考方案1】:

您不能保留 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 岁或更高)或复制内容,然后使用您的副本。

【讨论】:

以上是关于Android MediaPlayer 无法设置数据源 uri的主要内容,如果未能解决你的问题,请参考以下文章

MediaPlayer无法在Android Things Raspberry Pi 3上运行

应该有字幕控制器已经设置 Mediaplayer 错误 Android

无法在 android 中使用 MediaPlayer 播放 MediaStore.Audio 歌曲

无法使用 MediaPlayer 对象在 Android 中播放许多音频文件

Android:'无法播放此视频'; MediaPlayer和VideoView错误1 -38

无法使用 STREAM_VOICE_CALL 在 android java 中通过 MediaPlayer 播放音频