2016-08-15 47 views
0

在我的應用程序中,用戶可以在他的外部存儲器中保存截圖和文件。但是當外部存儲不可寫入時我該怎麼辦?將我的設備從棒棒糖更新爲棉花糖時遇到此問題。當我試圖保存屏幕截圖時,SD卡沒有被我的應用程序識別。但它可以通過ES Filex Explorer訪問,但是隻讀!不應該有一部分內部存儲在每個設備上保留爲「外部」存儲?爲什麼這不起作用?Android外部存儲手柄不可用

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

每個設備都有外部存儲器。並且每個應用程序都可以使用清單中請求的寫入外部存儲權限寫入它。如果你添加一個微型SD卡,然後在這個可移動存儲器上,大多數情況下都不能寫入。它不清楚你在說什麼。 – greenapps

+0

'用戶可以將截圖和文件保存在他的外部存儲中。是嗎?沒有人可以檢查你的代碼,因爲我們不知道'new Helper(this).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手動請求權限。