- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了类似的问题:-
MediaMetadataRetriever setdatasource IllegalArgumentException
IllegalArgumentException in setDataSource for MediaPlayer
MediaMetadataRetriever setDataSource throws IllegalArgumentException
所有建议我添加外部存储权限,或者该路径可能错误或无效。setDataSource()
方法可以同时采用 Context
和 Uri
.当我发送它们时,我得到 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,如下所示:-
Uri.parse(pref.getString("gotsong",""))//get the song Uri
我在共享首选项中设置了 Uri,如下所示:-
editor.putString("gotsong", uri.toString());// save the song uri
实际上,如果我不从共享首选项中检索并直接从文件中获取,也不异常(exception)。
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/
在使用客户端应用程序和OAuth2授权服务器时出现错误。我用的是Spring。我已经设置了授权服务器、资源服务器和客户端。使用cURL时,授权服务器和资源服务器工作正常。但是,当我为客户端编写设置(包
在使用客户端应用程序和OAuth2授权服务器时出现错误。我用的是Spring。我已经设置了授权服务器、资源服务器和客户端。使用cURL时,授权服务器和资源服务器工作正常。但是,当我为客户端编写设置(包
我希望你能找到我的文字,因为我真的对我的项目感到困惑,因为应用程序不能安装在模拟器中。我希望你的建议和指导。这是运行应用程序时的日志记录。RegisterViewModel.kt。密封的类资源.kt。
我正在尝试制作按钮,单击它们时会播放声音。但我有一个麻烦。我实在搞不清楚。这是我的代码: import javafx.application.Application; import javafx.ev
我正在查看一些遗留代码,发现一个部分导致我得到“比较方法违反了其一般契约!”错误。我知道这个错误是代码不具有传递性的结果,但我不完全理解如何正确修复它。 这是导致错误的代码。 private void
运行以下方法时,我不断收到 IllegalArgumentException: public int randomize(ArrayList list){ Random rdm = new R
我想给 Jenkins 添加一个新的 slave。当我遵循 Jenkins UI 时,它给了我下面的命令 java -jar agent.jar -jnlpUrl http:///computer//
我正在使用运行时反射来加载一个包含以下两个方法的类: public static void foo(int[] args) { System.out.print("foo invoked: "
我已经使用以下查询来匹配所有文档 { "query": { "custom_score": { "query": { "query_string": {
我有这个命令: list.stream() .filter(e -> ...) .sorted(comparatorShuffle()) .findAny() .orE
我收到以下运行时错误: checkParameterIsNotNull, parameter oneClickTokens at com.info.app.fragments.Fragmen
我有两个列表: (def xxa ["olp" "xyz"]) (def xxb ["ulove" "alove" "holp" "sholp"]) 还有一个函数尝试获取第一个列表的元素,这些元素是第
在我的代码中,我在向服务器执行请求的行中捕获了 IllegalArgumentException(索引 85 处查询中的非法字符)。使用 was build as patter 命令,另一个任务正确完
我试图将 String[] 放入 jsonObject 并收到以下错误 java.lang.IllegalArgumentException: Invalid type of value. Type:
我过去的一个试卷问题要求我修改一个方法,以导致发生 IllegalArgumentException。 该方法仅涉及从银行帐户余额中提取资金 这是执行此操作的方法。 公共(public)无效提款(双倍
我这里遇到了一点问题。我想弄清楚如何捕获 IllegalArgumentException。对于我的程序,如果用户输入负整数,程序应该捕获 IllegalArgumentException 并询问用户
每当插件尝试运行此延迟的任务时,我都会收到“ IllegalArgumentException:插件不能为空”错误: Bukkit.getServer().getScheduler().sched
我有这个命令: list.stream() .filter(e -> ...) .sorted(comparatorShuffle()) .findAny() .orE
我在更改应用程序中的场景时遇到问题,看起来像 Main screen > Login screen 我在主文件中将屏幕存储为 hashmap一切都很好,直到我从登录屏幕返回到主屏幕并想再次加载登录屏幕
我在这里缺少什么? 我得到异常:java.lang.IllegalArgumentException:对象不是声明类的实例 public boolean onSave(Object entity,Se
我是一名优秀的程序员,十分优秀!