2

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

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

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

4

2 回答 2

0

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

于 2012-11-29T21:01:06.770 回答
0

这似乎只是不存在 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 以拍照”的本机相机。

于 2013-10-11T07:54:16.793 回答