&引用;IllegalArgumentException:未知URL“;当试图删除Android中照相机创建的位图时

&引用;IllegalArgumentException:未知URL“;当试图删除Android中照相机创建的位图时,android,android-intent,bitmap,android-camera-intent,Android,Android Intent,Bitmap,Android Camera Intent,我有一个工作代码,它使用相机拍照。当拍摄完照片后,我会接收到它,以缩小它的比例,并以不同的方式对其进行操作。 我想做的是删除原始保存的图片(由Android自动完成),然后保存我的图片 下面是我启动意图的代码: private void takePicture(){ File storagePath = getAlbumStorageDir(); String timeStamp = System.currentTimeMillis()+"";

我有一个工作代码,它使用相机拍照。当拍摄完照片后,我会接收到它,以缩小它的比例,并以不同的方式对其进行操作。 我想做的是删除原始保存的图片(由Android自动完成),然后保存我的图片

下面是我启动意图的代码:

 private void takePicture(){
        File storagePath =  getAlbumStorageDir();
        String timeStamp = System.currentTimeMillis()+"";
        File file = new File(storagePath, timeStamp + ".jpg");

        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            file.delete();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        capturedImageUri = Uri.fromFile(file);
        Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        i.putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri);
        context.startActivityForResult(i, CameraCapture.REQUEST_TAKE_PHOTO);
    }

private File getAlbumStorageDir() {
        File file = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), context.getResources().getString(R.string.gallery));
        Log.d("PICTUREVIEW", file.getAbsolutePath());
        if (!file.mkdirs()) {
            Log.e("MyFileStorage", "Directory not created");
        }
        return file;
    }
当它被归还时,我是这样处理的:

private void manageCapturedPicture() {
    try {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        mediaScanIntent.setData(capturedImageUri);
        context.sendBroadcast(mediaScanIntent);
    //loadPictures();
    Bitmap bm = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(capturedImageUri));
    int width = LayoutUtil.getScreenWidth(context) * 2;
    if (width > 600) {
        width = 600;
    }
    double ratio = ((double)bm.getHeight() / (double)bm.getWidth());
    double height = width * ratio;
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(bm, width, (int)height, true);

    ContentResolver contentResolver = context.getContentResolver();
    contentResolver.delete(capturedImageUri, null, null);

    imageView.setImageBitmap(scaledBitmap);

} catch (IOException e) {
    e.printStackTrace();
}
}
如您所见,我正在缩小图像的比例,并在imageview中显示它(仅用于测试目的)。在我试图从外部存储器中删除原始图片之前,这一切都很正常。 当我将这些添加到行中时:

    ContentResolver contentResolver = context.getContentResolver();
    contentResolver.delete(capturedImageUri, null, null);
我得到了以下输出(当然还有崩溃):


在Java中,要删除文件,请创建一个指向该文件的
file
对象,并对该
file
对象调用
delete()

请注意,由于相机应用程序在前台时可能会发生配置更改或终止进程,因此请确保将文件路径保存在已保存的实例状态
Bundle
中,并从中还原

关于您的
manageCapturedPicture()
方法:

  • 如果您打算在几毫秒后将图像删除,请不要在
    MediaStore
    中为图像编制索引

  • 可以在
    BitmapFactory
    上使用
    decodeFile()
    ,因为这是一个由您控制的文件

  • 请使用
    BitmapFactory.Options
    并在读取图像时缩放图像,而不是通过读取完整图像然后缩放来浪费近两倍的堆空间

  • 不要试图从
    ContentProvider
    中删除
    ContentProvider中未从
    ContentProvider中获取的内容


非常感谢您的回答。您建议我使用什么来索引图像而不是MediaStore?有没有可能在不保存到内存的情况下从intent中获取完整图像?@user68621:“您建议我使用什么来索引图像而不是MediaStore?”——因为您正在删除图像,所以不要索引它。“有没有可能在不将图像保存到内存的情况下从intent中获取完整图像?”--如果“内存”指的是文件,则可以尝试实现不将图像存储到文件的流式
内容提供者
,然后在
额外输出中为该
内容提供者
传递一个
Uri
,虽然我没有试过。除此之外,它要么是磁盘上的全尺寸图像,要么是内存中的缩略图,要么不使用
ACTION\u image\u CAPTURE
。。嗯,我没有任何通过意图使用相机的经验,但与相机视图(surfaceview)相比,我能做的似乎有点“有限”。无论如何,我必须使用这个项目的意图。如果问题不太多,您能否在回答中提供一个示例,说明在删除原始图像的同时,您将如何使用相机来获得完整图像(而不是缩略图)的缩放版本?我有点困惑我现在应该用哪种方法。谢谢你的帮助,我找到了解决问题的办法。按照你的建议,我最终将图片作为临时文件保存在手机存储器中。每次我拍摄一张新照片时,都会保存在同一个位置,如果有,会覆盖旧的临时文件。当裁剪(和其他编辑)完成时,图片最终被保存。无论如何,谢谢你的帮助。我接受你的回答。如果您认为我的解决方案可以改进,我将很高兴再次收到您的来信。@Commonware delete file并不是删除Thumbail,
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {nightout.dk.nightoutandroid/nightout.dk.nightoutandroid.MainActivity}: java.lang.IllegalArgumentException: Unknown URL file:///storage/emulated/0/Pictures/nightout/1450477843900.jpg
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3790)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3833)
            at android.app.ActivityThread.access$1700(ActivityThread.java:152)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5538)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
     Caused by: java.lang.IllegalArgumentException: Unknown URL file:///storage/emulated/0/Pictures/nightout/1450477843900.jpg
            at android.content.ContentResolver.delete(ContentResolver.java:1323)
            at nightout.dk.nightoutandroid.views.PicturesView.manageCapturedPicture(PicturesView.java:137)
            at nightout.dk.nightoutandroid.views.PicturesView.receiveStringMessage(PicturesView.java:197)
            at nightout.dk.nightoutandroid.services.eventbus.EventBus.postStringMessage(EventBus.java:39)
            at nightout.dk.nightoutandroid.MainActivity.onActivityResult(MainActivity.java:158)
            at android.app.Activity.dispatchActivityResult(Activity.java:6238)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3786)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3833)
            at android.app.ActivityThread.access$1700(ActivityThread.java:152)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5538)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)