- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序播放为我的应用程序指定的内部目录 (/data/data/com...) 中的音频资源文件。似乎可以将文件下载到该位置,setDataSource(String path) 不会抛出任何异常,但 MediaPlayer.prepare() 抛出 IOException。相同的代码适用于 SD 卡。为什么会这样?
编辑:
让我们假设这是代码;它比我的代码更简单,并且抛出相同的异常:
package com.app.MediaPlayerTest;
public class MediaTest extends Activity {
MediaPlayer mp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DownloadFiles();
MusicPlay();
}
public void DownloadFiles() {
//Downloads Files
}
public void MusicPlay()
{
try {
mp.setDataSource("/data/data/com.app.pronounce/winds.mp3");
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
mp.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.setLooping(true);
mp.start();
}
}
至于堆栈跟踪:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x4001f1a8 self=0xce48
| sysTid=338 nice=0 sched=0/0 cgrp=bg_non_interactive handle=-1345006528
| schedstat=( 151460588 425586896 45 )
at android.os.BinderProxy.transact(Native Method)
at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:2547)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:76)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:854)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:851)
at dalvik.system.NativeStart.main(Native Method)
"Binder Thread #2" prio=5 tid=8 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40512b30 self=0x156e90
| sysTid=346 nice=0 sched=0/0 cgrp=default handle=1570912
| schedstat=( 4357682 930487 3 )
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #1" prio=5 tid=7 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40512a68 self=0x17f578
| sysTid=345 nice=0 sched=0/0 cgrp=bg_non_interactive handle=604904
| schedstat=( 6939806 13372136 3 )
at dalvik.system.NativeStart.run(Native Method)
"Compiler" daemon prio=5 tid=6 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050eba8 self=0x938c8
| sysTid=344 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1099136
| schedstat=( 4770066 33579300 5 )
at dalvik.system.NativeStart.run(Native Method)
"JDWP" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050eaf8 self=0x10c3c0
| sysTid=343 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1098624
| schedstat=( 14899224 33240040 20 )
at dalvik.system.NativeStart.run(Native Method)
"Signal Catcher" daemon prio=5 tid=4 RUNNABLE
| group="system" sCount=0 dsCount=0 obj=0x4050ea38 self=0x93570
| sysTid=342 nice=0 sched=0/0 cgrp=bg_non_interactive handle=588000
| schedstat=( 24278832 4707632 7 )
at dalvik.system.NativeStart.run(Native Method)
"GC" daemon prio=5 tid=3 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050e990 self=0x8f720
| sysTid=341 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1099336
| schedstat=( 791698 556969 3 )
at dalvik.system.NativeStart.run(Native Method)
"HeapWorker" daemon prio=5 tid=2 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050e8d8 self=0x10c740
| sysTid=340 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1357728
| schedstat=( 211702049 225986921 9 )
at dalvik.system.NativeStart.run(Native Method)
最佳答案
MediaPlayer 要求正在播放的文件具有世界可读权限。可以在adb shell中使用以下命令查看该文件的权限:
ls -al /data/data/com.mypackage/myfile
您可能会看到“-rw------”,这意味着只有所有者(您的应用,而不是 MediaPlayer)具有读/写权限。
注意:您的手机必须已 root,以便在不指定文件(在内部存储器中)的情况下使用 ls 命令。
如果你的手机已经root了,你可以使用以下命令在adb shell中添加world-read权限:
chmod o+r /data/data/com.mypackage/myfile
如果您需要以编程方式修改这些权限(需要 root 手机!),您可以在您的应用代码中使用以下命令:
Runtime.getRuntime().exec("chmod o+r /data/data/com.mypackage/myfile");
或
Runtime.getRuntime().exec("chmod 777 /data/data/com.mypackage/myfile");
这基本上是一个 linux 命令。参见 https://help.ubuntu.com/community/FilePermissions有关 chmod 的更多信息。
编辑:找到了另一种简单的方法 here (对那些没有 root 手机的人有用)。由于应用程序拥有该文件,它可以创建一个文件描述符并将其传递给 mediaPlayer.setDataSource():
FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile");
mediaPlayer.setDataSource(fileInputStream.getFD());
这种方式完全避免了权限问题。
关于Android 从内部存储播放资源文件导致 MediaPlayer.prepare 给出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4833777/
我对 MySql 有疑问,详情如下:我创建了一个新的模式/数据库,(仅)执行了这个查询: create table mytable ( id varchar(50) not null, name va
我正面临着 continuum 的发布问题:准备阶段在 scm-check-modifications 步骤中失败并出现错误: [ERROR] org.apache.maven.shared.rele
由于我要连接到外部数据库,因此我需要一种仅在必要时(如果有查询)才连接到数据库的方法。 我在 StackOverflow 上找到了这个答案:Auto connecting to PDO only if
每次我尝试将中等大小的 JSON 对象同步到我的数据库时都会遇到这个问题,以便我们可以对其执行一些报告。通过调查可能导致它的原因,我发现了有关此事的这些链接。 http://blog.corrlabs
我有从多个表返回结果的 MySQL View , 我正在尝试从 laravel 项目的这个 View 中进行一些查询, 本地服务器没有问题 但在远程服务器上显示以下错误 "General error:
我重写了我的网站 php 代码并添加了 MySQL 存储过程。 在我的本地版本中,一切正常,但在我将网站上传到托管服务器后,我不断收到 fatal error “准备好的语句需要重新准备”。 有时页面
我重写了我的站点 php 代码并添加了 MySQL 存储过程。 在我的本地版本中,一切正常,但在我将我的网站上传到托管服务器后,我不断收到 fatal error “Prepared statemen
我重写了我的站点 php 代码并添加了 MySQL 存储过程。 在我的本地版本中,一切正常,但在我将我的网站上传到托管服务器后,我不断收到 fatal error “Prepared statemen
我在运行批处理作业时收到以下错误。 sql.SQLException: Prepared statement needs to be re-prepared 什么情况下会遇到此错误? 最佳答案 这是一
prepare for segue 和 prepare for unwind 之间有什么区别?我已经将这两个实现到 Xcode 项目中,它们都得到了相同的结果。我实现这两个功能的代码是:(with p
作为指南,用于准备测试数据库的命令是 bundle exec rake db:test:prepare 但是,我发现以下命令也有效并为我创建了测试数据库。 bundle exec rake test:
我最近启动了我的基于 Laravel 的网站,我没有遇到任何问题,但是 40 分钟前当我检查它时我得到了这个错误: SQLSTATE[HY000]: General error: 1615 Prepa
更新:查询工作正常,如下所示;当我从 View 中选择时,错误只会出现。 $query = " SELECT ModuleID, ModuleName, Credits, Lecturer, Room
我的laravel项目每天早上都会出错,一段时间后就没事了。我不明白这是什么问题。 我用谷歌搜索了一下,发现了一些类似的问题。但这并不能解决我的问题。 db version is 5.1.1 最佳答案
所以根据this link一个是快捷方式包装器(所以我猜它们是一样的)。 当我运行 bundle exec rake db:test:prepare 时,我得到了这个错误: Don't know ho
我有两个 View ,第一个是一个简单的 View ,其中包含一些有关用法的介绍,通过单击按钮可以打开主视图。主视图有很多图像和两个自定义的表格,行由文本和图像组成,因此主视图的创建相当慢。分析器显示
大约 10 天前,我向我的 iTunes Connect 帐户添加了两个应用程序。一个是“轻型”版本,另一个是收费的。完整版本已经在应用商店上架,但免费版本的状态只是“准备上传”。十天后!一定有什么问
我在运行 mvn release:prepare 时遇到问题。我有以下消息: [ERROR] Failed to execute goal org.apache.maven.plugins: mave
我正在 MainActivity 处理程序的帮助下更新进度条但它给出了错误:无法在未调用 Looper.prepare() 的线程内创建处理程序 Error public class MainActi
在我的 django 项目中,我有 4 个模型,它们都连接在一条链中。 模型_D > 模型_C > 模型_B > 模型_A 因此 Model_C 有一个指向 Model_B 的外键字段,而 Model
我是一名优秀的程序员,十分优秀!