gpt4 book ai didi

java - 将 Uri 发送到 MediaMetadataRetriever 中的 setDataSource() 时出现 IllegalArgumentException

转载 作者:行者123 更新时间:2023-12-01 19:07:36 49 4
gpt4 key购买 nike

我遇到了类似的问题:-

MediaMetadataRetriever setdatasource IllegalArgumentException

IllegalArgumentException in setDataSource for MediaPlayer

MediaMetadataRetriever setDataSource throws IllegalArgumentException

Log

所有建议我添加外部存储权限,或者该路径可能错误或无效。setDataSource() 方法可以同时采用 ContextUri .当我发送它们时,我得到 IllegalArgumentException 。

这是我发送到 Uri 的方法:-

static List<String> getMusicNames(Context context,List<Uri> Uris){//get the music names


List<String> musicNames=new ArrayList<String>();


for(Uri uri:Uris){
MediaMetadataRetriever mData = new MediaMetadataRetriever();
mData.setDataSource(context, uri);//<<<<<at this line the error
musicNames.add(mData.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));


}//returning the music names
return musicNames;

}

我像这样发送 Uri :-

Arrays.asList(songUri)

它可以是多个或只是一个 Uri。

当我调试此方法时,Uri 会转到该方法:-content://com.android.externalstorage.documents/document/primary%3ADownload%2F01-1085088-Full%20Song-Track%201% 20_%20Sakkarathil%20amma.mp3

我确定音频文件在那里,并且我在另一个应用程序中打开了它。

Uri value

我从共享首选项中获取 Uri,如下所示:-

Uri.parse(pref.getString("gotsong",""))//get the song Uri

我在共享首选项中设置了 Uri,如下所示:-

editor.putString("gotsong", uri.toString());// save the song uri

实际上,如果我不从共享首选项中检索并直接从文件中获取,也不异常(exception)。

根据甲骨文IllegalArgumentException

public class IllegalArgumentException extends RuntimeException Thrown to indicate that a method has been passed an illegal or inappropriate argument.

这是原始的 setDataSource() 方法。我已经指出了抛出异常的位置:-

public void setDataSource(Context context, Uri uri)
throws IllegalArgumentException, SecurityException {
if (uri == null) {
throw new IllegalArgumentException()//<<<<<<<<<<<<<<<<<<<<<<<<<<<HERE
}

String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}

AssetFileDescriptor fd = null;
try {
ContentResolver resolver = context.getContentResolver();
try {
fd = resolver.openAssetFileDescriptor(uri, "r");
} catch(FileNotFoundException e) {
throw new IllegalArgumentException();//<<<<<<<<<<<<<<<<<<<<<<<<<<<HERE
}
if (fd == null) {
throw new IllegalArgumentException();//<<<<<<<<<<<<<<<<<<<<<<<<<<<HERE
}
FileDescriptor descriptor = fd.getFileDescriptor();
if (!descriptor.valid()) {
throw new IllegalArgumentException();//<<<<<<<<<<<<<<<<<<<<<HERE
}
// Note: using getDeclaredLength so that our behavior is the same
// as previous versions when the content provider is returning
// a full file.
if (fd.getDeclaredLength() < 0) {
setDataSource(descriptor);
} else {
setDataSource(descriptor, fd.getStartOffset(), fd.getDeclaredLength());
}
return;
} catch (SecurityException ex) {
} finally {
try {
if (fd != null) {
fd.close();
}
} catch(IOException ioEx) {
}
}
setDataSource(uri.toString());
}

显然,Uri 不为 null,因此它是其他 3 个原因之一,其中一个在 FileNotFoundException 中,另外两个我不明白。

我的问题实际上与这个问题类似:- Save uri to sharedPreferences and play with mediaplayer

最佳答案

我发现问题是,如果 Uri 保存在 Sharedpreferences 中而没有读写 Uri 的权限,特别是针对音频文件等文件的 Uri Iam ,则会出现 IllegalArgumentException 。因此,该方法适用于例如,如果我直接发送文件 Uri ,如果我保存共享首选项中包含文件的文件夹路径,然后提取 Uris 并将它们发送到该方法,或者如果我授予这些权限以在共享首选项中保存文件,然后检索并发送到方法。

所以我实现了 Recek 的答案:-

https://stackoverflow.com/a/46506626/7552894

首先,我的 Intent 是 ACTION_OPEN_DOCUMENT:-

     intent.setType("audio/*");
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);

我在第一次获得 Intent 后添加此部分的位置:-

     this.grantUriPermission(this.getPackageName(), data.getData(), Intent.FLAG_GRANT_READ_URI_PERMISSION);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data.
//noinspection WrongConstant
this.getContentResolver().takePersistableUriPermission(data.getData(), takeFlags);

-保存到共享首选项。并正常检索。有趣的是,直接来自文件的 Uri 如下所示:-content://com.android.externalstorage.documents/document/primary%3ADownload %2FDeath%20Grips%20-%20Get%20Got.mp3

如果未保存在共享首选项中,则获取结果。

然而,从新 Intent 中得到的结果看起来像这样:- content://com.android.providers.downloads.documents/document/433

可以保存的。

编辑

文件夹树 Uri 也可以在没有读取 Uri 权限的情况下保存和检索,只有文件树需要 Uri 权限。我尝试从 Uri 树获取文件夹树,但这在获取文件时不起作用,Uri 必须来自 Intent 。

关于java - 将 Uri 发送到 MediaMetadataRetriever 中的 setDataSource() 时出现 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59522478/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com