簡體   English   中英

Android MediaPlayer無法設置uri

[英]Android MediaPlayer unable to setDataSource uri

我正在嘗試使用sharedPreferences存儲以前播放的歌曲的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.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失敗。: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(this,Uri.parse(myUri.toString))代替也沒有問題。

您無法持久保存Uri值,並希望它以后能正常工作。 那些具有content計划的程序使您可以在很短的時間內訪問內容

如果您使用ACTION_OPEN_DOCUMENT來獲取Uri ,則可以通過ContentResolver上的takePersistableUriPermission()請求對內容的長期訪問。 但是,您仍然必須處理用戶可能移動或刪除內容的可能性。

如果您使用ACTION_GET_CONTENT來獲取Uri ,請切換到ACTION_OPEN_DOCUMENT (如果您的minSdkVersion為19或更高),或制作內容的副本,然后使用副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM