Android — Избегайте сохранения в хранилище / эмулируется / 0

#android #image #android-studio #save #public

#Android #изображение #android-studio #Сохранить #общедоступный

Вопрос:

Я пытаюсь сохранить изображение в общедоступном каталоге хранилища, используя приведенный ниже код. Однако, когда это сохраняется в хранилище / эмулируемое / 0, а не в общедоступную папку с изображениями. Я использовал в основном этот точный код в другом приложении, и он работал нормально. Кто-нибудь знает, почему .getExternalStoragePublic каталог не возвращает доступный /Pictures/ и вместо этого возвращает хранилище /emulated/0 ?

У меня есть «uses-permission android:name =»android.permission.WRITE_EXTERNAL_STORAGE» в моем файле манифеста

 File backupFile;
File appFolder;
String path= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()   "/CustomFolder";
appFolder = new File(path);
if (!appFolder.exists())
    appFolder.mkdir();
String fileName = "picture.jpg"
backupFile = new File(appFolder, fileName);
FileOutputStream output = null;
try {
    output = new FileOutputStream(backupFile);
    output.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    mImage.close();
    if (null != output) {
        try {
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  

Комментарии:

1. appFolder.mkdir(); Проверьте возвращаемое значение, поскольку может не получиться создать каталог. Отобразите всплывающее окно, если оно возвращает false, и не продолжайте код, а возвращайте.

2. Почему вы публикуете весь этот код, когда единственное, что вы хотите сказать, это то, что Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() папка отличается от ожидаемой. Или нет?

3. is not returning the accessible /Pictures/ and instead returning storage/emulated/0 . Он никогда не вернется /Pictures/ , но может вернуться /storage/emulated/0/Pictures .

Ответ №1:

Неважно, я понял это. Оказывается, просто «использует-разрешение android: name =»android.permission.WRITE_EXTERNAL_STORAGE» в файле манифеста недостаточно, и мне пришлось поместить перед ним следующий код, чтобы заставить его работать:

     int CAMERA_PERMISSION_REQUEST_CODE = 2;
    int result = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (result != PackageManager.PERMISSION_GRANTED){
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            Toast.makeText(getActivity().getApplicationContext(), "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},CAMERA_PERMISSION_REQUEST_CODE);
        }
    }
  

Комментарии:

1. Если это была проблема, то вы дезинформировали нас, сказав, что изображение было записано. Только в другом месте.