2016-08-15 3 views
0

В моем приложении пользователь может сохранять скриншоты и файлы во внешнем хранилище. Но что делать, если внешнее хранилище невозможно записать? У меня была эта проблема при обновлении моего устройства от леденца до зефира. SD-карта не получила признания от моего приложения, когда я попытался сохранить скриншот. Но это было доступно ES File Explorer, но ПРОЧИТАНО! Должна ли быть часть внутренней памяти, зарезервированная как «внешняя» память на каждом устройстве? Почему это не сработало?Android External storage handle недоступен

P.S. Код хорошо работает, когда внешнее хранилище можно записать!

Вот мой код:

Bitmap bitmap = getScreenshotFromRecyclerView(recyclerView); 
     File file = storeImage(bitmap, name); 
     if(file != null){ 
      Toast.makeText(this, getString(R.string.screenshotSaved, name), Toast.LENGTH_LONG).show(); 
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.parse(file.toURI().toString()), "image/*"); 
      startActivity(intent); 
     }else{ 
      Toast.makeText(this, getString(R.string.notAvailable), Toast.LENGTH_LONG).show(); 
     } 



    private File storeImage(Bitmap image, String name) { 
      File pictureFile = getOutputMediaFile(name); 
      if (pictureFile == null) { 
       System.out.println("Error A"); 
      }else{ 
       try { 
        FileOutputStream fos = new FileOutputStream(pictureFile); 
        image.compress(Bitmap.CompressFormat.PNG, 90, fos); 
        fos.close(); 
       } catch (FileNotFoundException e) { 
        System.out.println("Error B"); 
       } catch (IOException e) { 
        System.out.println("Error C"); 
       } 
      } 

      return pictureFile; 
     } 

private File getOutputMediaFile(String name){ 
     File mediaStorageDir = new File(new Helper(this).getPathToAppFolder()); 

     // Create the storage directory if it does not exist 
     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       return null; 
      } 
     } 
     // Create a media file name# 
     File mediaFile; 
     if(!name.equals(getString(R.string.training))){ 
      String timeStamp = new SimpleDateFormat("dd.MM.yyyy_HH:mm", Locale.getDefault()).format(new Date()); 
      String mImageName= name + "_" + timeStamp + ".jpg"; 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); 
     }else{ 
      String mImageName= name + ".jpg"; 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); 
     } 

     return mediaFile; 
    } 
+0

Каждое устройство имеет внешнее хранилище. И каждое приложение может писать на него с разрешением на запись внешнего хранилища, запрошенным в манифесте. Если вы добавите карту micro SD, то на этом съемном носителе в основном невозможно писать. Его неясно, о чем вы говорите. – greenapps

+0

'пользователь может сохранять скриншоты и файлы в своем внешнем хранилище'. Это? Никто не может проверить ваш код, поскольку мы не знаем, что «новый Помощник (это) .getPathToAppFolder()' поставляет. – greenapps

+0

Он хорошо работал на леденец. public String getPathToAppFolder() { return Environment.getExternalStorageDirectory() + "/ Android/data /" + context.getPackageName() + "/ Files /"; } – XxGoliathusxX

ответ

1

Вам нужно будет просить разрешения Зефира стиля, смотрите здесь больше: https://guides.codepath.com/android/Understanding-App-Permissions#permission-updates-in-marshmallow

Перед запуском файла операция сохранения вам нужно проверить, если разрешения принимается, если нет, вы решаете, что имеет смысл для вашего приложения иметь «изящный» сбой.

+0

Мне нужно спросить или всегда? – XxGoliathusxX

+0

Всегда правильный путь. Пользователи могут аннулировать разрешение в любое время, поэтому вам нужно иметь возможность справиться с этим, чтобы избежать сбоев, связанных с разрешениями. –

+0

спасибо. Он работает сейчас! – XxGoliathusxX

1

Из Зефира вам нужно спросить разрешение для пользователя для записи/чтения памяти телефона.

см. Этот пример или используйте это example, чтобы запросить разрешение вручную.

 Смежные вопросы

  • Нет связанных вопросов^_^