简体   繁体   中英

Android Lollipop save image downloaded in background on SD-CARD

whit ANDROID previous kitkat I was able to store an image on sd-card without problem, now, instead, I've a lot of difficult.

I can't understand how use a new Access Store Framework of Android Lollipop and I don't know if it is useful to case of mine.

This code below is a part of my project and it's worked perfectly

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

How I change this to use new ASF of Android??

If I use Environment.getExternalStorageDirectory().getAbsolutePath(); I can't get path of sd-card.

Thanks

using SAF in this example i was able to write on sdcard:

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 use de SAF to select the sdcard to gain full permissions, like explained in https://metactrl.com/docs/sdcard-on-lollipop/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM