选取照片,拍照,录音 都是调用系统自带的
直接录音不会出错,但是 选取照片或者拍完照片后,再录音就报java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1具体报错提示:05-28 17:05:03.466: E/AndroidRuntime(32226): FATAL EXCEPTION: main
05-28 17:05:03.466: E/AndroidRuntime(32226): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=4, result=-1, data=Intent { dat=content://media/external/audio/media/229 }} to activity {com.agilemobi.activity/com.agilemobi.activity.AudioActivity}: java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.deliverResults(ActivityThread.java:3734)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3776)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.access$2800(ActivityThread.java:135)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2166)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.os.Handler.dispatchMessage(Handler.java:99)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.os.Looper.loop(Looper.java:144)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.main(ActivityThread.java:4937)
05-28 17:05:03.466: E/AndroidRuntime(32226): at java.lang.reflect.Method.invokeNative(Native Method)
05-28 17:05:03.466: E/AndroidRuntime(32226): at java.lang.reflect.Method.invoke(Method.java:521)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-28 17:05:03.466: E/AndroidRuntime(32226): at dalvik.system.NativeStart.main(Native Method)
05-28 17:05:03.466: E/AndroidRuntime(32226): Caused by: java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.os.Parcel.readException(Parcel.java:1255)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:450)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.content.ContentResolver.insert(ContentResolver.java:587)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.agilemobi.widget.AudioWidget.setBinaryData(AudioWidget.java:225)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.agilemobi.view.ODKView.setBinaryData(ODKView.java:47)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.agilemobi.activity.AudioActivity.onActivityResult(AudioActivity.java:158)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.Activity.dispatchActivityResult(Activity.java:3931)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.deliverResults(ActivityThread.java:3730)
05-28 17:05:03.466: E/AndroidRuntime(32226): ... 11 more
而且这个错,只在HTC G7上出现,别的手机没发现。
直接录音不会出错,但是 选取照片或者拍完照片后,再录音就报java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1具体报错提示:05-28 17:05:03.466: E/AndroidRuntime(32226): FATAL EXCEPTION: main
05-28 17:05:03.466: E/AndroidRuntime(32226): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=4, result=-1, data=Intent { dat=content://media/external/audio/media/229 }} to activity {com.agilemobi.activity/com.agilemobi.activity.AudioActivity}: java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.deliverResults(ActivityThread.java:3734)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3776)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.access$2800(ActivityThread.java:135)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2166)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.os.Handler.dispatchMessage(Handler.java:99)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.os.Looper.loop(Looper.java:144)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.main(ActivityThread.java:4937)
05-28 17:05:03.466: E/AndroidRuntime(32226): at java.lang.reflect.Method.invokeNative(Native Method)
05-28 17:05:03.466: E/AndroidRuntime(32226): at java.lang.reflect.Method.invoke(Method.java:521)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-28 17:05:03.466: E/AndroidRuntime(32226): at dalvik.system.NativeStart.main(Native Method)
05-28 17:05:03.466: E/AndroidRuntime(32226): Caused by: java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.os.Parcel.readException(Parcel.java:1255)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:450)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.content.ContentResolver.insert(ContentResolver.java:587)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.agilemobi.widget.AudioWidget.setBinaryData(AudioWidget.java:225)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.agilemobi.view.ODKView.setBinaryData(ODKView.java:47)
05-28 17:05:03.466: E/AndroidRuntime(32226): at com.agilemobi.activity.AudioActivity.onActivityResult(AudioActivity.java:158)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.Activity.dispatchActivityResult(Activity.java:3931)
05-28 17:05:03.466: E/AndroidRuntime(32226): at android.app.ActivityThread.deliverResults(ActivityThread.java:3730)
05-28 17:05:03.466: E/AndroidRuntime(32226): ... 11 more
而且这个错,只在HTC G7上出现,别的手机没发现。
解决方案 »
- SDL在android上怎么显示YUV视频数据
- ANDROID里到底怎么用M3G(JSR184)啊?
- int转16进制
- 怎么传多组text和图片?
- 在下拉菜单中加入RadioButton等控件的问题
- 记事本的实现原理?
- 怎么得到工程附件路径?
- phonegap加载本地的html,只能加载assets下的吗?其他位置的怎么加载?
- android摄像头采集 + x264进行编码
- 从Fragment跳转到activity时切换动画
- 求教listview中单击音乐列表播放音乐的问题啊~~~
- nbandroid插件和android sdk以后添加平台的时候不会看到Google Android Open Handled
实际上 URI是 content://media/external/audio/media/ ,
我看了下 MediaProvider的源码 有发现 content://media/external/audio/albumart/-1
不过我没跟踪到这里。
private void deleteMedia() {
// get the file path and delete the file
File f = new File(Constants.INSTANCEFOLDER + "/" + mBinaryName);
if (!f.delete()) {
Log.i(TAG, "Failed to delete " + f);
} // clean up variables
mBinaryName = null;
} private String getPathFromUri(Uri uri) { String[] audioProjection = { Audio.Media.DATA };
Cursor c = ((Activity) getContext()).managedQuery(uri, audioProjection,
null, null, null);
String audioPath = null;
if (c != null) {
((Activity) getContext()).startManagingCursor(c);
int column_index = c.getColumnIndexOrThrow(Audio.Media.DATA); if (c.getCount() > 0) {
c.moveToFirst();
audioPath = c.getString(column_index);
}
} else {
Toast.makeText(this.getContext(),
"Can not open selected media file.", Toast.LENGTH_LONG)
.show();
}
return audioPath;
} @Override
public void setBinaryData(Object binaryuri) {
// TODO Auto-generated method stub
if (mBinaryName != null) {
deleteMedia();
}
Log.i("AudioWidget binaryuri", binaryuri + "");
// get the file path and create a copy in the instance folder
String binaryPath = getPathFromUri((Uri) binaryuri);
Log.i("AudioWidget binaryPath", binaryPath);
String extension = binaryPath.substring(binaryPath.lastIndexOf("."));
String destAudioPath = Constants.INSTANCEFOLDER + "/"
+ System.currentTimeMillis() + extension;// 项目对应的存放路径
if (binaryPath != null) {
File source = new File(binaryPath);
File newAudio = new File(destAudioPath);
FileUtils.copyFile(source, newAudio);// 将source路径下的文件copy到newAudio if (newAudio.exists()) {
// Add the copy to the content provier
ContentValues values = new ContentValues(6);
values.put(Audio.Media.TITLE, newAudio.getName());
values.put(Audio.Media.DISPLAY_NAME, newAudio.getName());
values.put(Audio.Media.DATE_ADDED, System.currentTimeMillis());
values.put(Audio.Media.DATA, newAudio.getAbsolutePath()); System.out.println("Audio.Media.EXTERNAL_CONTENT_URI:"
+ Audio.Media.EXTERNAL_CONTENT_URI);// content://media/external/audio/media
Uri AudioURI = getContext().getContentResolver().insert(
Audio.Media.EXTERNAL_CONTENT_URI, values);
Log.i(TAG,
"Inserting AUDIO returned uri = " + AudioURI.toString());
} else {
Log.e(TAG, "Inserting Audio file FAILED");
} mBinaryName = newAudio.getName();
enabledAudioPlayBtn();
mWaitingForData = false;
}
}调用系统录音功能完成后,会调用onActivityResult(),然后 判断调用setBinaryData();
setBinaryData()方法的参数 是录完音后,得到的URI 。Uri media = intent.getData();另外。出错所在的行在 setBinaryData()的
Uri AudioURI = getContext().getContentResolver().insert(
Audio.Media.EXTERNAL_CONTENT_URI, values);
感谢大伙们来回复,出错行 Audio.Media.EXTERNAL_CONTENT_URI为content://media/external/audio/media/
insert 后,就出现我上面说的问题。
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), SELECT_PICTURE);另外
1.请用 log 代替system.out.
2.AudioURI -> audioUri
3. 没有必要用 managerquery , cursor的调用格式一般为:if (c != null {
try {
//do something.
finally {
c.close();
}
避免内存泄漏
@Override
public void onClick(View v) {
// Intent i = new Intent(Intent.ACTION_GET_CONTENT);
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*"); ((Activity) getContext())
.startActivityForResult(i, FormEntryActivity.IMAGE_CHOOSER); }
});
本身 选取的照片和录音文件 也是存在一个同一个目录下,该目录是 从sqlite数据库查询出来的,这条记录是项目刚开始就保存了。
亲,前面贴的代码,是我单独从项目抽取出来,自己写的一个,在任何机上没问题。
Constants.INSTANCEFOLDER 这个是我模拟项目里的一个文件保存路径
public static final String INSTANCEFOLDER = Environment.getExternalStorageDirectory().getPath() + "/audio";
代码都差不多,唯一不同的是 我在9楼提到的路径问题。本身项目开发我没参与过,目前只是在改里面的BUG。
我看到那路径,被以前那哥们以一个静态变量在activity里给保存,我就想死的心都有。
我是多么希望 抽出出来的也报同一个错。所以我断定 那些URI 啥的 没问题, 不然我自己的工程也会有错。
我目前发现一点,录音和拍照 存放文件的目录(因为我需要将这些文件放到固定目录下进行上传),如果换成sdcard下其他目录,没有出现问题。
本身,应用程序开启,会在sdcard下建立一个项目目录,folder = xxx/instances/当前日期和时分秒/
存放在该目录下会有问题。
是不是该目录正在使用,或者说 扫描 就会有问题呢?