【问题标题】:Android ContentResolver.insert crashes with "unable to create new file"Android ContentResolver.insert 因“无法创建新文件”而崩溃
【发布时间】:2012-11-29 19:34:23
【问题描述】:

我的活动的某些功能中有一个代码:

ContentValues cv = new ContentValues();
cv.put(MediaStore.Images.Media.TITLE, "1354213408296.jpg");
ContentResolver contentResolver = getContentResolver();
Uri imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cv);

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

startActivityForResult(cameraIntent, 712984419/*Some request code*/);

它崩溃了:

java.lang.IllegalStateException: Unable to create new file:
/mnt/sdcard/DCIM/Camera/1354213408296.jpg at
android.os.Parcel.readException(Parcel.java:1335) at
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:182) at
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136) at
android.content.ContentProviderProxy.insert(ContentProviderNative.java:415) at
android.content.ContentResolver.insert(ContentResolver.java:730)

崩溃:

contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cv);

"1354213408296.jpg" 只是 System.currentTimeInMillis() + ".jpg",所以它始终是唯一的

android.permission.WRITE_EXTERNAL_STORAGE 在清单中提供

这是一些手机的环境规格(我正在使用 ACRA 来获取它):

getDataDirectory=/data
getDownloadCacheDirectory=/cache
getExternalStorageAndroidDataDir=/mnt/sdcard/Android/data
getExternalStorageDirectory=/mnt/sdcard 
getExternalStorageState=removed
getRootDirectory=/system 
getSecureDataDirectory=/data 
getSystemSecureDirectory=/data/system 
is4GConfig=true 
is8GConfig=false 
isEncryptedFilesystemEnabled=false 
isExternalStorageEmulated=false 
isExternalStorageRemovable=true

我能做些什么来防止这种崩溃?

【问题讨论】:

  • 请告诉我您找到了解决方法...
  • @n1k1ch - 你解决了吗?
  • @Rat-a-tat-a-tat Ratatouille,我记得,有一些硬件问题(可能没有 sdcard)。问题很久没有复现了。
  • 哦,好吧。我尝试创建一个没有 sdcard 的模拟器,但不幸的是无法产生崩溃.. :(

标签: android android-sdcard android-contentresolver


【解决方案1】:

我不确定你想做什么。您似乎所做的只是尝试在 MediaStore.Images.Media 中创建一个新行,其中只有一个 TITLE 列。放入一个没有数据的标题没有多大意义。

【讨论】:

  • 已编辑 - 我添加了一些代码。我想这样做:准备 Uri 并保存它;开始相机活动并拍照;能够通过保存的 uri 访问令牌照片
【解决方案2】:

这似乎只是不存在 sdcard 时会遇到的另一个异常(我只能在非常奇怪的模拟器上重现它,但谁知道呢?)。一定要处理丢失 sdcard 的情况。我目前的解决方案如下:

public static Uri getImageFileUri(Context context) throws IOException{
    String fullFileName = generateImageFileName(imageName); // a method i have defined
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, fullFileName);
        return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    } else {
        return Uri.fromFile(new File(fullFileName));
    }
}

这是我用来生成Uri 的方法,我将使用它来启动相机意图。之后我就像你一样使用它。问题是我在没有 sdcard 的情况下返回的值将无法正常工作,但另一方面,如果没有 sdcard,Android 设备不允许拍照。使用此解决方案,如果有 sdcard,您将成功拍照,并在其他情况下启动将显示消息“插入 sdcard 以拍照”的本机相机。

【讨论】:

  • 我遇到了这个问题,但我不知道哪个模拟器会导致这个问题。请你分享一下我是如何 cud 创建这样一个模拟器的,或者如果我 cud 从 genymotion 获得一个模拟器?
  • @Rat-a-tat-a-tatRatatouille 也许只是创建一个没有任何 sdcard 的模拟器?看到我发布了没有 sdcard 的 Nexus S 的答案目标的时间。
  • 我做到了,但后来我得到一个 filenotfound 异常,但从来没有一个非法状态异常,但是,这确实发生在真实设备上:( .. 我想复制它以解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2016-02-07
  • 2016-04-23
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多