2016-03-30 31 views
0

beyaz ANDROID önceki kitkat Bir sd kartında görüntüyü sorunsuz bir şekilde saklayabildim, şimdi çok zorum.Android Lollipop SD-CARD üzerinde arka planda indirilen görüntüyü kaydetme

Android Lollipop'un yeni bir Access Store Çerçevesinin nasıl kullanıldığını ve bunun benim için yararlı olup olmadığını bilmiyorum.

aşağıda Bu kod Projemin bir parçasıdır ve bu yeni Android ASF kullanmak değiştirmek nasıl mükemmel

private Bitmap getBitmap(String url, String image){ 

     String root = Environment.getExternalStorageDirectory().toString(); 
     root = "/mnt/extSdCard/"; 


     Bitmap bitmap = null; 

     File f=fileCache.getFile(url); 

     //from SD cache 
     bitmap = decodeFile(f); 
     if(bitmap!=null) 
      return bitmap; 


     try{ 
      bitmap = BitmapFactory.decodeFile(root + image); 
      if(bitmap!=null){ 
       return bitmap; 
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 

     //from web 
     if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
      Foto foto = new Foto(); 
      try { 
       try{ 

        foto = new ObjectMapper().readValue(new URL("http://www.xxxxxx.yyyy/project/script.php?id="+url), 
           Foto.class); 

        if(foto!=null){ 
         String[] values = image.split("/"); 
         File dir = new File(root + values[0]); 
         if (!dir.exists()) { 
          dir.mkdir(); 
          String fname = values[1]; 
          File file = new File (dir, fname); 
          bitmap = BitmapFactory.decodeByteArray(foto.getFoto(), 0, foto.getFoto().length); 
          try { 
           FileOutputStream out = new FileOutputStream(file); 
           bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
           out.flush(); 
           out.close(); 

          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         }else{ 
          String fname = values[1]; 
          File file = new File (dir, fname); 
          bitmap = BitmapFactory.decodeByteArray(foto.getFoto(), 0, foto.getFoto().length); 
          try { 
           FileOutputStream out = new FileOutputStream(file); 
           bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
           out.flush(); 
           out.close(); 

          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 

         //bitmap = decodeFile(f); 
         return bitmap; 
        }else{ 
         return bitmap; 
        } 
       }catch(Exception e){ 
        e.printStackTrace(); 
        return null; 
       } 


      } catch (Exception ex){ 
       if (ex instanceof SQLiteConstraintException){ 
        bitmap = BitmapFactory.decodeByteArray(foto.getFoto(), 0, foto.getFoto().length); 
        return bitmap; 
       }else{ 
        ex.printStackTrace(); 
        return null; 
       } 
      } 
     }else{ 
      return bitmap; 
     } 
    } 

çalıştı ??

Environment.getExternalStorageDirectory().getAbsolutePath(); kullanırsam sd-card yolunu alamıyorum. i sdcard yazabiliyordu bu örnekte SAF kullanılarak

Teşekkür

+0

Şu anda karşılaştığınız hata nedir? Kök değerini neden kodlanmış dizeye yeniden atayacaksınız? Bu Environment.getExternalStorageDirectory(). GetAbsolutePath() kullanın; – Stallion

+0

'Environment.getExternalStorageDirectory() işlevini kullanıyorum. GetAbsolutePath(); 'sd-kart yolu –

cevap

-1

:

public class MainActivity extends AppCompatActivity { 

Uri sdCardUri; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
     startActivityForResult(intent, 1); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) 
    { 
     case 1: 

      if (resultCode == Activity.RESULT_OK) { 
       sdCardUri = data.getData(); 

       getContentResolver().takePersistableUriPermission(sdCardUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      } 
      createFile(); 

      break; 
    } 
} 

private void createFile() { 
    DocumentFile sdCard=DocumentFile.fromTreeUri(this,sdCardUri); 
    DocumentFile createFile=sdCard.findFile("teste.txt"); 
    if (createFile==null) 
     createFile=sdCard.createFile("text","teste.txt"); 
    OutputStream outStream = null; 
    try { 
     outStream = getContentResolver().openOutputStream(createFile.getUri()); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     String teste="Isto é um teste"; 
     outStream.write(teste.getBytes()); 
     outStream.flush(); 
     outStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} i tam izinleri kazanmak için Sdcard'ı seçmek için SAF de kullanmak

gibi açıklanmıştır https://metactrl.com/docs/sdcard-on-lollipop/

+0

bulamıyorum geçerli bir çözüm değil ... Bu veorid stüdyo öykünücüsü bana bu bana/sdcard/Download' ver ama dizini silinebilir –

+0

Henüz üzerinde çalışan sdcard kullanım kılavuzu seçimini nasıl önleyebileceğinizi bilmiyor musunuz? –