2016-11-08 30 views
0

我有一款應用程序在Android 6中運行,可以從BLE設備中流入數據。當使用類似的東西時,此工作正常:Android 6 - 以編程方式將應用程序文件複製到另一個文件夾

myFile = new File(getExternalFilesDir(filepath),MyData);

生成的文件是,看起來像位置:

文件路徑:/存儲/模擬/ 0 /安卓/數據/ my_package /文件/ my_file

我想這個文件複製到一個新的文件夾,沒有被埋在Android/data目錄下的大量文件中,因此用戶可以通過USB電纜輕鬆找到並檢索連接到手機/平板電腦的數據。到目前爲止,我一直無法弄清楚如何做到這一點......或者甚至有可能。我嘗試的任何東西似乎都會導致權限異常。

如果可能的話,我希望這個文件夾與〜/ Android /數據處於同一級別。如果不是,有沒有其他的選擇?如將數據放在SD卡上。

我已閱讀了Android文件系統上的許多帖子和文章。這一切都很混亂和模糊。 Android的新版本似乎改變了事情的運作方式。如果有人知道與Android 6(Marshmallow)相關的清晰簡明的解釋(甚至可能包含實例),請告訴我。

謝謝,最大

+0

棉花糖需要在運行時檢查,以檢查權限此https://developer.android.com/training/permissions /requesting.html – Nakul

回答

0

我使用阿迪爾土耳其人許可建議刪除權限下面給出的過程僅僅是6.0其他Android OS permossion將被授予。我不需要檢查構建版本,因爲我只使用Android 6(API 23)。

// 
// Get storage write permission 
// 
public boolean isStoragePermissionGranted(int requestCode) { 
    if (ContextCompat.checkSelfPermission(MyActivity.this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      == PackageManager.PERMISSION_GRANTED) { 

     //Now you have permission 
     return true; 
    } else { 


     ActivityCompat.requestPermissions(MyActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); 
     return false; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

     //Now you have permission 

     // Check file copy generated the request 
     // and resume file copy 
     if(requestCode == WFileRequest) 
      try { 
       copyFile(OriginalDataFileName); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 
} 

雖然這通過允許例外了,它並沒有回答如何將默認的應用程序目錄外部創建一個文件夾的問題。下面的代碼獲取權限,並在/ storage/emulated/0上創建一個名爲AppData的文件夾,它出現在設備存儲的頂層。在Adeel Turk的例子中,權限請求代碼WFileRequest被設置爲4,但我知道你可以使用任何數字。然後,權限請求回調將檢查請求代碼,並再次使用最初寫入的文件的名稱調用copyFile例程。

大部分代碼使用的例子,從這個論壇一對夫婦的其他職位在how to create a folder in android External Storage Directory?How to copy programmatically a file to another directory?

public void copyFile(String SourceFileName) throws FileNotFoundException, IOException 
{ 
    String filepath = ""; 
    // 
    // Check permission has been granted 
    // 
    if (isStoragePermissionGranted(WFileRequest)) { 
     // 
     // Make the AppData folder if it's not already there 
     // 
     File Directory = new File(Environment.getExternalStorageDirectory() + "/AppData"); 
     Directory.mkdirs(); 

     Log.d(Constants.TAG, "Directory location: " + Directory.toString()); 
     // 
     // Copy the file to the AppData folder 
     // File name remains the same as the source file name 
     // 
     File sourceLocation = new File(getExternalFilesDir(filepath),SourceFileName); 
     File targetLocation = new File(Environment.getExternalStorageDirectory() + "/AppData/" + SourceFileName); 

     Log.d(Constants.TAG, "Target location: " + targetLocation.toString()); 

     InputStream in = new FileInputStream(sourceLocation); 
     OutputStream out = new FileOutputStream(targetLocation); 

     // Copy the bits from instream to outstream 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
     in.close(); 
     out.close(); 
    } 

} 
0

由於某些安全原因,android 6.0限制運行時權限。因此,以下代碼將幫助您獲得許可。

注意不要從清單從清單

public static final int galleryPermissionRequestCode=4; 


public void chkForPermissoins(){ 



if (Build.VERSION.SDK_INT >= 23) { 
        //do your check here 

        isStoragePermissionGranted(camPermissionRequestCode); 

       } else { 

        //You already have the permission because the os you appp is running on is less tahn 23 (6.0) 

       } 


} 


public boolean isStoragePermissionGranted(int requsetCode) { 
     if (Build.VERSION.SDK_INT >= 23) { 
      if (ContextCompat.checkSelfPermission(getActivity(),android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        == PackageManager.PERMISSION_GRANTED) { 

       //Now you have permsssion 
       return true; 
      } else { 


       ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requsetCode); 
       return false; 
      } 
     } 
     else { //permission is automatically granted on sdk<23 upon installation 

      //Now you have permsssion 
      return true; 
     } 


    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if(grantResults[0]== PackageManager.PERMISSION_GRANTED){ 

     //Now you have permsssion 
     //resume tasks needing this permission 
     } 
    } 
+0

比我期待的要複雜得多!我需要一些時間來進行測試。欣賞示例代碼,因爲它似乎涵蓋了Android開發人員頁面中未提供的一些技術。 – Max

+0

非常感謝您可以通過投票我的答案,如果你想要欣賞:D –

+0

我會upvote,但我需要更多的點來這樣做。對不起,你的回答確實讓我指出了正確的方向。 – Max

相關問題