私はカスタムビューを使用しており、ユーザーが何でも描画できるキャンバスを使用しています。その後、その画像をSDカードに保存したいbtはそれを行うことができませんでした。何が起こっているのか分からない。
else if(view.getId()==R.id.save_btn){
//save drawing
AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
saveDialog.setTitle("Save drawing");
saveDialog.setMessage("Save drawing to device Gallery?");
saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
private FileOutputStream fOut;
public void onClick(DialogInterface dialog, int which){
//save drawing
drawView.setDrawingCacheEnabled(true);
//attempt to save
String imgSaved = MediaStore.Images.Media.insertImage(
getContentResolver(), drawView.getDrawingCache(),
UUID.randomUUID().toString()+".png", "drawing");
//feedback
if(imgSaved!=null){
Toast savedToast = Toast.makeText(getApplicationContext(),
"Drawing saved to Gallery!", Toast.LENGTH_SHORT);
savedToast.show();
}
else{
Toast unsavedToast = Toast.makeText(getApplicationContext(),
"Oops! Image could not be saved.", Toast.LENGTH_SHORT);
unsavedToast.show();
}
drawView.destroyDrawingCache();
}
});
saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
dialog.cancel();
}
});
saveDialog.show();
}
ここにISエラーの詳細
04-14 11:24:28.700: E/MediaStore(6866): Failed to insert image
04-14 11:24:28.700: E/MediaStore(6866): Java.io.FileNotFoundException: No such file or directory
04-14 11:24:28.700: E/MediaStore(6866): at Android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.Java:146)
04-14 11:24:28.700: E/MediaStore(6866): at Android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.Java:577)
04-14 11:24:28.700: E/MediaStore(6866): at Android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.Java:673)
04-14 11:24:28.700: E/MediaStore(6866): at Android.content.ContentResolver.openOutputStream(ContentResolver.Java:537)
04-14 11:24:28.700: E/MediaStore(6866): at Android.content.ContentResolver.openOutputStream(ContentResolver.Java:513)
04-14 11:24:28.700: E/MediaStore(6866): at Android.provider.MediaStore$Images$Media.insertImage(MediaStore.Java:891)
04-14 11:24:28.700: E/MediaStore(6866): at com.example.clent.MainActivity$9.onClick(MainActivity.Java:238)
04-14 11:24:28.700: E/MediaStore(6866): at com.Android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.Java:166)
04-14 11:24:28.700: E/MediaStore(6866): at Android.os.Handler.dispatchMessage(Handler.Java:99)
04-14 11:24:28.700: E/MediaStore(6866): at Android.os.Looper.loop(Looper.Java:137)
04-14 11:24:28.700: E/MediaStore(6866): at Android.app.ActivityThread.main(ActivityThread.Java:5103)
04-14 11:24:28.700: E/MediaStore(6866): at Java.lang.reflect.Method.invokeNative(Native Method)
04-14 11:24:28.700: E/MediaStore(6866): at Java.lang.reflect.Method.invoke(Method.Java:525)
04-14 11:24:28.700: E/MediaStore(6866): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:737)
04-14 11:24:28.700: E/MediaStore(6866): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
04-14 11:24:28.700: E/MediaStore(6866): at dalvik.system.NativeStart.main(Native Method)
画像を保存しようとすると、常にこのメッセージが表示されます... "エラー:画像を保存できませんでした。" ...
私はエミュレータ(Android 4.4)でこの問題を抱えていましたが、それは Androidバグ が原因であることがわかりました。初期化されていません。)。回避策は、写真ディレクトリを手動で初期化することです:
void fixMediaDir() {
File sdcard = Environment.getExternalStorageDirectory();
if (sdcard != null) {
File mediaDir = new File(sdcard, "DCIM/Camera");
if (!mediaDir.exists()) {
mediaDir.mkdirs();
}
}
}
これが新しいバージョンのAndroidで修正されているかどうかは不明です。
少し遅い答えですが、それでも...
どちらが238行目かはわかりませんが、おそらくその理由は次のとおりです。
String imgSaved = MediaStore.Images.Media.insertImage(getContentResolver()、drawView.getDrawingCache()、UUID.randomUUID()。toString()+ "。png"、 "drawing");
このメソッドはクリックリスナー内にあるため、getContentResolver
はアプリケーションのリゾルバーとは異なるリゾルバーを返す場合があります。コンテンツリゾルバーへのプライベートリファレンスを保存するか、getContentResolver
をMainActivity.this.getContentResolver()
に置き換えてみてください。
String imgSaved = MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver()、drawView.getDrawingCache()、UUID.randomUUID()。toString()+ ".png"、 "drawing");
または、許可の問題である可能性があります。あなたが持っているマニフェストで確認してください:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
最後に、insertImage
の結果はURIであり、imgSaved
はその変数に最適な名前ではありません:)