2014-04-14 17 views
16

Tôi đang sử dụng chế độ xem tùy chỉnh và trong đó tôi đang sử dụng canvas mà người dùng có thể vẽ bất kỳ thứ gì và sau đó tôi muốn lưu hình ảnh đó vào sd thẻ bt đã không thể làm điều đó. Không biết chuyện gì đang diễn ra.MediaStore.Images.Media.insertImage trở về null khi cố gắng lưu hình ảnh

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

ĐÂY LÀ CHI TIẾT LỖI

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) 

Tôi luôn nhận được thông điệp này trong khi cố gắng để lưu hình ảnh .... "Oops! Hình ảnh có thể không được lưu." .....

+0

có cùng sự cố trên Android 4.4.2 SM-P601. Chèn phương pháp hình ảnh luôn thất bại. với cùng một ngoại lệ. –

Trả lời

6

Một cắn câu trả lời muộn, nhưng vẫn ...

Không chắc đó là dòng 238, nhưng có lẽ lý do là ở đây:

Chuỗi imgSaved = MediaStore.Images.Media.insertImage ( getContentResolver(), drawView.getDrawingCache(), UUID.randomUUID(). ToString() + ". Png", "drawing");

Vì phương thức nằm trong trình nghe nhấp chuột getContentResolver có thể trả lại Trình phân giải khác với trình xử lý cho ứng dụng. Hoặc là lưu một tham chiếu tới resolver nội dung, hoặc bạn có thể thử thay thế getContentResolver với MainActivity.this.getContentResolver():

Chuỗi imgSaved = MediaStore.Images.Media.insertImage ( MainActivity.this.getContentResolver(), drawView.getDrawingCache (), UUID.randomUUID(). ToString() + ".png", "bản vẽ");

Ngoài ra, đó có thể là sự cố cấp quyền. Hãy chắc chắn rằng trong biểu hiện bạn có:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Một lưu ý cuối cùng, kết quả của insertImage là một URI, imgSaved không phải là tên tốt nhất cho biến mà :)

+0

Cảm ơn, nhận xét của bạn đã giúp tôi. Tôi đã tạo một ContentResolver contentResolver riêng tư như một trường trong bộ điều hợp của tôi, trên khởi tạo, tôi đã đính kèm getContext(). GetContentResolver(); với nó và khi thực hiện insertImage tôi đã sử dụng contentResolver. – lxknvlk

+6

Không làm việc cho tôi! Android 4.4.2 tại đây – gogonapel

24

Tôi có vấn đề này trong Emulator (Android 4.4) và hóa ra là do Android bug, nơi xảy ra khi người dùng không chụp ảnh trên thiết bị trước đó (tức là thư viện trống và chưa được khởi chạy). Giải pháp thay thế là khởi chạy thư mục ảnh theo cách thủ công:

void fixMediaDir() { 
    File sdcard = Environment.getExternalStorageDirectory(); 
    if (sdcard != null) { 
     File mediaDir = new File(sdcard, "DCIM/Camera"); 
     if (!mediaDir.exists()) { 
      mediaDir.mkdirs(); 
     } 
    } 
} 

Không chắc chắn nếu điều này được khắc phục trong các phiên bản sau của Android.

+1

Làm việc cho tôi, cảm ơn bạn! –

+1

Có. Thích nhận xét này. Đung. – mghhgm

Các vấn đề liên quan