选取照片,拍照,录音 都是调用系统自带的
直接录音不会出错,但是 选取照片或者拍完照片后,再录音就报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上出现,别的手机没发现。

解决方案 »

  1.   

    存入数据库的的操作没有成功。Unknown URL: content://media/external/audio/albumart/-1-1表示你存入数据库后,这个record在数据库中对应主键的ID, 如果没有存入成功,则返回 -1.
      

  2.   

    我调用的系统自带的录音功能,
    实际上 URI是 content://media/external/audio/media/ ,
    我看了下 MediaProvider的源码  有发现 content://media/external/audio/albumart/-1
    不过我没跟踪到这里。
      

  3.   


    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 后,就出现我上面说的问题。
      

  4.   

    选择照片的地方有问题。试试这种。
    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();
       }
    避免内存泄漏
      

  5.   

    我这项目里选择照片:mChooseButton.setOnClickListener(new View.OnClickListener() {
                @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);            }
            });
      

  6.   

    还是有问题的,不过 我发现 选取照片和 录音文件 保存的sdcard路径,如果用一个常量 单独写出来,就不会出现上述问题。
    本身 选取的照片和录音文件 也是存在一个同一个目录下,该目录是 从sqlite数据库查询出来的,这条记录是项目刚开始就保存了。
      

  7.   

    真是弄不明白,在别的手机 啥问题都没得, 在HTC G7问题这么大。
      

  8.   

    亲,表示需要更多的代码才能 定位问题, Constants.INSTANCEFOLDER 这个变量之类的代码。
      

  9.   

    确定只在HTC 上出问题。
    亲,前面贴的代码,是我单独从项目抽取出来,自己写的一个,在任何机上没问题。
    Constants.INSTANCEFOLDER 这个是我模拟项目里的一个文件保存路径
    public static final String INSTANCEFOLDER = Environment.getExternalStorageDirectory().getPath() + "/audio";
    代码都差不多,唯一不同的是 我在9楼提到的路径问题。本身项目开发我没参与过,目前只是在改里面的BUG。
    我看到那路径,被以前那哥们以一个静态变量在activity里给保存,我就想死的心都有。
      

  10.   

    我自己抽取出来的工程,我可以单独发你邮件。
    我是多么希望 抽出出来的也报同一个错。所以我断定 那些URI 啥的 没问题, 不然我自己的工程也会有错。
      

  11.   

    http://stackoverflow.com/questions/6205049/android-devices-with-environment-getexternalstoragedirectory-mnt-sdcard最后一个人的回答, 希望对你有帮助,
      

  12.   

    感谢你的帮助,我看了下,我项目里 路径是/mnt/sdcard/下,纠结ing.
      

  13.   

    http://stackoverflow.com/questions/6817755/how-can-i-understand-android-crash-errors-and-rectify-them-edited-solved
      

  14.   

    大神们,快出现吧,
    我目前发现一点,录音和拍照 存放文件的目录(因为我需要将这些文件放到固定目录下进行上传),如果换成sdcard下其他目录,没有出现问题。
    本身,应用程序开启,会在sdcard下建立一个项目目录,folder = xxx/instances/当前日期和时分秒/
    存放在该目录下会有问题。
    是不是该目录正在使用,或者说 扫描 就会有问题呢?