2016-07-18 66 views
2

我想要的图像文件复制与此代码:如何将图像复制到SD卡上的现有目录?

InputStream fileInputStream = null; 
OutputStream fileOutputStream = null; 
String inPath = "/storage/emulated/0/Pictures/MyImage.jpg"; 
String outPath = "/storage/extSdCard/MyFolder/MyImage.jpg"; 
    try { 
    verifyStoragePermissions(this); 
    fileInputStream = new FileInputStream(new File(inPath)); 
    File outputFile = new File(outPath); 
     if (!outputFile.exists()) { 
      try { 
       outPutFile.createNewFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    fileOutputStream = new FileOutputStream(outputFile); 

    byte[] buffer = new byte[1024]; 
    int read; 
    while ((read = fileInputStream.read(buffer)) != -1) { 
     fileOutputStream.write(buffer, 0, read); 
    } 
    fileInputStream.close(); 
    fileInputStream = null; 
    fileOutputStream.flush(); 
    fileOutputStream.close(); 
    fileOutputStream = null; 

    } catch (Exception e) { 
    Log.e("tag", e.getMessage()); 
    } 

而这是用于在SDK> = 23

// Storage Permissions 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.READ_EXTERNAL_STORAGE, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE 
}; 

/** 
* Checks if the app has permission to write to device storage 
* 
* If the app does not has permission then the user will be prompted to grant permissions 
* 
* @param activity 
*/ 
public static void verifyStoragePermissions(Activity activity) { 
    // Check if we have write permission 
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    if (permission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
} 

而且结果验证存储权限的方法是这样的错误发生在达到buffer行之前。

Unable to decode stream: java.io.FileNotFoundException: /storage/extSdCard/MyFolder/MyImage.jpg: open failed: ENOENT (No such file or directory) 

我有SD卡和画廊的应用程序上MyFolder在我的设备将图像复制到该目录中没有任何问题。

注意:权限是在清单中(在应用程序标记前的正确位置)和内部活动(对于skd> = 23)中授予的。

EDITS:

  1. 实现创建fileOutputStream之前文件的建议(没有帮助)。

  2. 降低targetSdkVersion以超过与权限相关的任何可能的问题,但仍然没有成功。

targetSdkVersion 22

  • 创建这样File

    File outFile = new File("/storage/extSdCard", "MyFolder/MyImage.jpg");

    也取得了不结果。

  • 我测试它的Android版本22

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

    回答

    0

    这是我使用SAF来完成工作的方式。

    private void newcopyFile(File fileInput, String outputParentPath, 
            String mimeType, String newFileName) { 
    
    DocumentFile documentFileGoal = DocumentFile.fromTreeUri(this, treeUri); 
    
    String[] parts = outputParentPath.split("\\/"); 
    for (int i = 3; i < parts.length; i++) { //ex: parts:{"", "storage", "extSdCard", "MyFolder", "MyFolder", "MyFolder"} 
        if (documentFileGoal != null) { 
         documentFileGoal = documentFileGoal.findFile(parts[i]); 
        } 
    } 
    if (documentFileGoal == null) { 
        Toast.makeText(MainActivity.this, "Directory not found", Toast.LENGTH_SHORT).show(); 
        return; 
    } 
    
    DocumentFile documentFileNewFile = documentFileGoal.createFile(mimeType, newFileName); 
    
    InputStream inputStream = null; 
    OutputStream outputStream = null; 
    try { 
        outputStream = getContentResolver().openOutputStream(documentFileNewFile.getUri()); 
        inputStream = new FileInputStream(fileInput); 
    } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
    } 
    try { 
        if (outputStream != null) { 
         byte[] buffer = new byte[1024]; 
         int read; 
         if (inputStream != null) { 
          while ((read = inputStream.read(buffer)) != -1) { 
           outputStream.write(buffer, 0, read); 
          } 
         } 
         if (inputStream != null) { 
          inputStream.close(); 
         } 
         inputStream = null; 
         outputStream.flush(); 
         outputStream.close(); 
         outputStream = null; 
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
    } 
    
    0

    您需要先创建文件,FileOutputStream会抛出异常,如果该文件不存在FileNotFoundException

    File outputFile = new File(outPath); 
    file.createNewFile(); 
    fileOutputStream = new FileOutputStream(outputFile); 
    
    +0

    '打开失败:EACCES(权限被拒绝)' – Eftekhari

    +0

    试过你的答案,但没有帮助。 – Eftekhari

    0

    如果您在您的应用gradle文件中使用targetSdkVersion 23(或更高版本),则需要明确请求权限(可以放入Activity的onCreate方法或a吨监听方法),这样的...

    private static final int CODE_WRITE_EXTERNAL = 10; 
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
           if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
            Log.d(TAG, "onCreate: " + "Show explanation"); 
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_WRITE_EXTERNAL); 
           } else { 
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_WRITE_EXTERNAL); 
           } 
          } else { 
           Log.d(TAG, "onCreate: " + "Permission already granted!"); 
           //Call your method to save the file 
          } 
    

    然后,你需要实现下一个回调方法

    @Override 
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
         switch (requestCode) { 
          case CODE_WRITE_EXTERNAL : { 
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
            Log.d(TAG, "onRequestPermissionsResult: Good to go!"); 
            //Call your mehotd here 
           } else { 
            Log.d(TAG, "onRequestPermissionsResult: Bad user"); 
           } 
          } 
         } 
        } 
    
    +0

    谢谢,但我已经实施读写权限请求sdk 23及以上,并为简单的问题决定不提及它。这是错误的决定抱歉。仍然有问题。 – Eftekhari