2013-07-28 33 views
7

Tôi đã sử dụng cách hệ thống tiết kiệm screenshots để lưu các ảnh bitmap của tôi vào đĩa và thư viện. Điều này hoạt động trong Android 4.2 và trước nhưng không hoạt động trong Android 4.3.Lưu bitmap vào đĩa/thư viện trong Android 4.3

đang liên quan:

Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
OutputStream out = resolver.openOutputStream(uri); 

Full đang here.

Tuy nhiên, trong 4.3 (Nexus 7 mới), tôi nhận được FileNotFoundException trên dòng thứ hai. Tôi không thể thấy bất kỳ thay đổi nào trong 4.3 có liên quan đến điều này trên website.

Vậy cách đúng để lưu hình ảnh vào đĩa và thư viện là gì?

xác minh:

  • lưu trữ được gắn với điều này method
  • imageUri không phải là null (thường là một cái gì đó như "nội dung: // media/bên ngoài/images/media/2034")
  • manifest có cho phép android.permission.WRITE_EXTERNAL_STORAGE
+0

Bạn đang sử dụng HTC để kiểm tra? –

+0

Đã cập nhật OP để làm rõ rằng đây là trên trình mô phỏng. Tuy nhiên, người dùng đã thông báo rằng bản cập nhật 4.3 đã phá vỡ ứng dụng và tôi tin rằng đó là do sự cố này. – f2prateek

+0

Trình mô phỏng của bạn có gắn thẻ SD không, ý tôi là, nó xảy ra một để quên bật mô phỏng SD? :) Bạn có thể kiểm tra xem tệp có tồn tại nếu không, tạo tempfile và ghi vào dòng đầu ra mà bạn nhận được từ ContentResolver –

Trả lời

0

Trong tệp kê khai của bạn, hãy thử thay đổi mục tiêu sdk thành 18.-

<uses-sdk android:minSdkVersion="7" 
    android:targetSdkVersion="18"/> 

Nó có thể giải quyết vấn đề của bạn (Có thể không). Trong 4.3 JELLY_BEAN_MR2, android đã thực hiện một số thay đổi và android đã viết rõ ràng rằng Ứng dụng của bạn có thể hoạt động sai trong môi trường hồ sơ bị hạn chế. vì vậy hãy nhìn vào http://developer.android.com/about/versions/android-4.3.html

+0

Điều đó không có tác dụng, vẫn là vấn đề tương tự. – f2prateek

1

Đây là cách tôi lưu bitmaps đến Gallery:

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
Uri contentUri; //instantiate Uri with location of image 
mediaScanIntent.setData(contentUri); 
context.sendBroadcast(mediaScanIntent); 
+0

Điều này thực sự có liên quan đến việc lưu trữ BITMAP trong thư viện? Tôi có nghĩa là MediaStore.Images.Media.insertImage (ContentResolver cr, bitmap source, String title, String description) – Yar

+0

@Yar, Có - điều này cũng giống như vậy, chỉ là một cách khác - bằng cách phát sóng ý định mà URI đã cho có chứa vị trí của hình ảnh sẽ được thêm vào thư viện. – Phil

+0

Vì vậy, nếu tôi có một bitmap thô, tôi có nên lưu trữ nó ở đâu đó trên thẻ SD và sau đó phát sóng ý định đó không? Uri đặt vào tập tin mới của tôi? – Yar

0

Tôi có những phép trong Manifest của tôi.

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

Nhưng tôi đang sử dụng SDK phiên bản mục tiêu 15. Có yêu cầu bạn phải sử dụng SDK mục tiêu 18 không?

BTW:

Dưới đây là một số mẫu mã để tải về hình ảnh hồ sơ cá nhân từ Facebook:

private class DownloadProfilePicTask extends AsyncTask<Void,String,String> { 
    Bitmap profilePic; 
    String fileName; 
    String id; 
    String type; 
    URL img_value; 
    public DownloadProfilePicTask(String i,String ty) 
    { 
     id = i; 
     if(id==null) 
     { 
      //Log.v("Id is null", "Error"); 
     } 
     //Log.v("Download Profile Pic Task initialized for id:",id); 
     type = ty; 
    } 
    @Override 
    protected String doInBackground(Void...param) { 
     String root = Environment.getExternalStorageDirectory().toString(); 
     if(root==null) 
     { 
      return null; 
     } 
     try{ 
     profilePic = BitmapFactory.decodeStream(img_value.openConnection().getInputStream()); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 

     } 

     if(profilePic == null) 
     { 
      //Log.v("profilePic is null", "Error"); 
     } 
     //Log.v("Root for saving images",root); 
     File myDir = new File(root + "/saved_images"); 
     myDir.mkdirs(); 
     fileName = root + "/saved_images/" + id + ".png"; 
     //Log.v("filename is ",fileName); 
     File file = new File (fileName); 
     fileName = file.getPath(); 
     if (file.exists()) file.delete(); 
     try { 
       FileOutputStream out = new FileOutputStream(file); 
       profilePic.compress(Bitmap.CompressFormat.PNG, 90, out); 
       out.flush(); 
       out.close(); 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
     return id; 
    } 
    @Override 
    protected void onPreExecute() 
    { 
     try 
     { 
      img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=" + type); 
     } 
     catch (MalformedURLException e) { 
       e.printStackTrace(); 

     } 

    } 
    @Override 
    protected void onPostExecute(String result) { 
    } 
} 

và sau đó tôi chỉ cần gọi:

new DownloadProfilePicTask(id,type).execute(); 

để tải về và tự động lưu hình ảnh.

Lưu ý: Bạn sẽ phải chơi với filePath một chút cho vị trí chính xác.

0

Có một số thay đổi trong tệpSystem trên Android 4.3 để bắt đầu tránh dev. để ghi trực tiếp vào "/ sdcard" hoặc "/ mnt/sdcard" nhưng sử dụng hệ thống Android ExternalStorage. (http://source.android.com/devices/tech/storage/index.html)

N.B.: ExternalStorage có thể là bộ nhớ trong: p

Trong trường hợp của bạn, bạn đã thử sử dụng phương pháp dựa trên getExternalStorage chưa? (như thế này: Find an external SD card location)

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