&引用;IllegalArgumentException:未知URL“;当试图删除Android中照相机创建的位图时
我有一个工作代码,它使用相机拍照。当拍摄完照片后,我会接收到它,以缩小它的比例,并以不同的方式对其进行操作。 我想做的是删除原始保存的图片(由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()+"";
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中获取的内容
内容提供者
,然后在额外输出中为该内容提供者
传递一个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)