【问题标题】:Weird URI behavior java/setDataSource/MediaPlayer奇怪的 URI 行为 java/setDataSource/MediaPlayer
【发布时间】:2016-08-30 12:16:36
【问题描述】:

我正在使用一个 URI,它像这样传递给 android 上的 MediaPlayer:

mediaPlayer.setDataSource(context, Uri.parse(<uri>));

当我使用 Intent.createChooser 获取它时,它会播放一次然后尝试让它再次播放导致 java.io.IOException: setDataSource failed.: status=0x80000000。

当我直接将 URI 作为字符串传递时,它会导致 java.io.IOException: setDataSource failed.: status=0x80000000,尽管选择器输出的 URI 始终相同。

URI 如下所示:“content://com.android.providers.media.documents/document/audio%3A21739”。

有人能解释一下为什么会这样吗?

【问题讨论】:

    标签: java android android-mediaplayer


    【解决方案1】:

    原来 android 需要一些奇怪的权限恶作剧,解决方案是使用不同的开头加上使用某种权限要求,以某种方式输出相同的 uri,但具有持久访问权限:

    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                        intent.setType("*/*");
                        intent.addCategory(Intent.CATEGORY_OPENABLE);
                        startActivityForResult(Intent.createChooser(intent, "Select file to add"), ADD_2);
    

    在 onActivityResult 中:

    if (resultCode == RESULT_OK) {
                    Uri uri = data.getData();
                    final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
                    getContentResolver().takePersistableUriPermission(uri, takeFlags);
                    Log.d(TAG, "Added track uri: " + uri);
                    playlist.add(uri.toString());
                    adapter.notifyDataSetChanged();
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2018-08-15
      • 2017-09-27
      • 2015-12-04
      相关资源
      最近更新 更多