【问题标题】:Playing audio from uri从 uri 播放音频
【发布时间】:2016-06-25 08:58:07
【问题描述】:

当我尝试播放音频文件时,我收到java.lang.SecurityException。 我尝试制作简单的应用程序,从手机内存中选择音频并使用sqlite 保存并列出之前选择的那些。

在应用程序中,第一次播放音频文件没有任何错误。但是在我重新启动应用程序后它不会播放而是返回SecurityException. 我正在使用下面的代码来选择音频文件

       Intent intent = new Intent();
                intent.setType("audio/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select Audio "), REQUEST_CODE);

  @Override
    protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
        if(requestCode == REQUEST_CODE && data != null){
            Toast.makeText(MainActivity.this, "DATA " + data.getData(), Toast.LENGTH_SHORT).show();
            //Prompting alertdialog for name of the audio file           
           AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Enter name for audio");
            final EditText input = new EditText(this);
            input.setInputType(InputType.TYPE_CLASS_TEXT);
            builder.setView(input);
            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                   sql.addToHistory(new soundDB.Effects(null,data.getData().toString(),input.getText().toString()));
               new loadEffects().execute();
                }
            });
            builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            builder.show();
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

我在清单文件中使用这些权限

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" />

06-25 11:45:21.902 17298-17372/? I/DefaultRequestDirector: I/O exception (javax.net.ssl.SSLException) caught when processing request: Write error: ssl=0x8d334c00: I/O error during system call, Broken pipe
06-25 11:46:03.204 7086-7086/? I/dex2oat: dex2oat took 893.003ms (threads: 4) arena alloc=3KB (3288B) java alloc=2MB (2752008B) native alloc=3MB (3826768B) free=2MB (2464688B)
06-25 11:46:12.890 7234-7234/? W/MediaPlayer: Couldn't open content://com.android.providers.downloads.documents/document/545: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{d912193 7234:[package name]/u0a116} (pid=7234, uid=10116) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
06-25 11:46:12.938 7234-7234/? D/MediaPlayer: create failed:

【问题讨论】:

  • 你的安卓操作系统版本是6.0?还是 API 23?
  • 我在 5.1.1 模拟器和 android N beta 设备上试过
  • 您已获得 android 6.0 的运行时权限。
  • 我从设置>手动授予权限

标签: android audio uri media


【解决方案1】:

但在我重新启动应用程序后,它不会播放而是返回 SecurityException。

默认情况下,在您的进程的整个生命周期内,您仅对Uri 标识的内容拥有权利。将其视为与 Web 应用程序中的用户会话相关联的 URL;一旦该会话超时,该 URL 将不再可用。

在 API 级别 19+ 上,您可以尝试 using takePersistableUriPermission() 以更持久地访问内容。但是,ACTION_OPEN_DOCUMENTACTION_GET_CONTENT 更多,所以它可能不起作用。

【讨论】:

    【解决方案2】:

    我在尝试使用 uri 播放音频文件时也遇到了这个问题。这就是我解决它的方法。在获取音频文件 uri 时,我使用 ACTION_OPEN_DOCUMENT 而不是 ACTION_GET_CONTENT,并将这一行添加到 onActivityResult。

    this.getContentResolver().takePersistableUriPermission(currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

    public void getAudioFileUri(View v) {
    
      Intent intent = new Intent();
      intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
      intent.setType("audio/*");
      intent.addCategory(Intent.CATEGORY_OPENABLE);
      try {
        startActivityForResult(Intent.createChooser(intent, "Choose audio file"), 1);
      } catch (Exception ex) {
    
      }
    }
    
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
      Uri currentUri = null;
      if (resultCode == Activity.RESULT_OK) {
        if (requestCode == 1) {
          if (resultData != null) {
            currentUri = resultData.getData();
            this.musicUri = currentUri.toString();
            this.getContentResolver().takePersistableUriPermission(currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
          }
        }
      }
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多