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

これは、SD カードが存在しない場合に発生する別の例外のようです (非常に奇妙なエミュレーターでのみ再現できましたが、誰が知っていますか?)。SD カードが見つからない場合は確実に処理する必要があります。私の現在の解決策は次のとおりです。

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));
    }
}

これは、UriI will start the camera インテントを生成するために使用する方法です。その後、私はあなたとまったく同じように使用します。問題は、SD カードがない場合に返される値が正しく機能しないということですが、一方、SD カードが存在しない場合、Android デバイスでは写真を撮ることができません。このソリューションを使用すると、SD カードがある場合は写真を撮ることができ、それ以外の場合は「写真を撮るために SD カードを挿入してください」というメッセージを表示するネイティブ カメラが起動します。

于 2013-10-11T07:54:16.793 に答える