сохранить растровое изображение на SD-карту без создания файла - PullRequest
0 голосов
/ 15 мая 2018

Я хочу сохранить растровое изображение в виде файла jpg на моей SD-карте при нажатии кнопки.Когда я запускаю следующий код, я не получаю ошибку, но когда я проверяю SDcard на телефоне, файл не создается.Что я делаю не так?

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
            }

            String root = Environment.getExternalStorageDirectory().toString();
            //String root = System.getenv("SECONDARY_STORAGE");
            File myDir = new File(root + "/Screenshots");
            myDir.mkdirs();
            Random generator = new Random();
            int n = generator.nextInt(10000);
            String fname = n+".jpg";
            File file = new File(myDir, fname);
            Log.d("DD",""+file);
            if (file.exists()) {
                file.delete();
            }
            try {
                FileOutputStream out = new FileOutputStream(file);
                rBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();

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

У меня есть разрешение в манифесте, но файл по-прежнему не создается:

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

Я провел некоторое исследование, которое предлагает getExternalStorageDirectory ()не указывать путь к SDcard, но следующая альтернатива дает ноль:

String root = System.getenv ("SECONDARY_STORAGE");

1 Ответ

0 голосов
/ 15 мая 2018

Нашел ответ, указанный @CommonsWare, который должен вызывать MediaScannerConnection.scanFile, чтобы MediaStore мог обнаружить файл и вывести его в проводнике. Также предложенные @greenapps файлы находятся во внешнем хранилище 0, а не на SD-карте.

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
            }

            String root = Environment.getExternalStoragePublicDirectory("").toString();
            //String root = System.getenv("SECONDARY_STORAGE");
            File myDir = new File(root + "/Screenshots");
            if (!myDir.exists())
                if (!myDir.mkdirs())
                    {Toast.makeText(activity, "make dir failed.", Toast.LENGTH_SHORT).show(); return;}
            Random generator = new Random();
            int n = generator.nextInt(10000);
            String fname = n+".jpg";
            File file = new File(myDir, fname);
            Log.d("DD",""+file);
            try {
                FileOutputStream out = new FileOutputStream(file);
                rBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

            //add mediastore discovery
            MediaScannerConnection.scanFile(activity, new String[] {file.getAbsolutePath()},new String[] {null}, null);
        }
    }
...