2013-07-28 9 views
7

Używam sposobu, w jaki system zapisuje screenshots, aby zapisać moje bitmapy na dysku i galerii. Działa to w systemie Android 4.2 i wcześniej, ale nie w systemie Android 4.3.Zapisywanie bitmapy na dysk/galerii w systemie Android 4.3

odpowiedni kod:

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

Pełny kod here.

Jednak w 4.3 (nowy Nexus 7) otrzymuję numer FileNotFoundException w drugim wierszu. Nie widziałem żadnych zmian w 4.3 odnoszących się do tego na website.

Jaki jest więc właściwy sposób zapisywania obrazu na dysku i galerii?

Verified:

  • przechowywanie jest zamontowany z tym method
  • imageUri nie jest zerowy (zwykle coś jak "content: // media/zewnętrzna/images/media/2034")
  • manifestu ma android.permission.WRITE_EXTERNAL_STORAGE
+0

Czy używasz HTC do testowania? –

+0

Zaktualizowany OP, aby wyjaśnić, że jest to na emulatorze. Jednak użytkownicy zgłosili, że aktualizacja 4.3 powoduje przerwanie aplikacji i jestem pewien, że wynika to z tego problemu. – f2prateek

+0

Czy twój emulator zamontował kartę SD, to znaczy, że zapomniałem włączyć emulację SD? :) Czy możesz sprawdzić, czy plik istnieje, jeśli nie, utwórz plik tymczasowy i zapisz go w strumieniu wyjściowym, który otrzymałeś z ContentResolver –

Odpowiedz

0

uprawnienie W swoim pliku manifestu spróbuj docelowej zmiany SDK do 18.-

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

To może rozwiązać twój problem (może nie). W 4.3 JELLY_BEAN_MR2, Android zrobił kilka zmian, a Android wyraźnie napisał, że Twoja aplikacja może źle działać w środowisku o ograniczonym profilu. więc proszę spojrzeć na http://developer.android.com/about/versions/android-4.3.html

+0

To nie zadziałało, ciągle ten sam problem. – f2prateek

1

ten sposób mogę zapisać bitmaps do Galerii:

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

Czy jest to rzeczywiście istotne dla przechowywania BITMAP w galerii? Mam na myśli MediaStore.Images.Media.insertImage (ContentResolver cr, źródło bitmapy, tytuł ciągu, opis ciągu) – Yar

+0

@Yar, tak - robi to dokładnie to samo, tylko w inny sposób - przez nadanie intencji, że dany URI zawierający lokalizacja obrazu powinna zostać dodana do galerii. – Phil

+0

Więc jeśli mam surową bitmapę, czy powinienem ją przechowywać gdzieś na karcie SD, a następnie transmitować intencję? Uri ustawił mój nowy plik? – Yar

0

mam te uprawnienia w moim manifestu.

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

Ale używam docelowego pakietu SDK w wersji 15. Czy istnieje wymóg, aby użyć docelowego zestawu SDK 18?

BTW:

Oto przykładowy kod do pobierania zdjęć profilowych z 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) { 
    } 
} 

a potem po prostu zadzwoń:

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

do automatycznego pobierania i zapisywania obrazów.

Uwaga: Będziesz musiał grać trochę z filePath dla dokładnej lokalizacji.

Powiązane problemy