2016-11-08 1 views
0

BLEデバイスからデータをストリームするAndroid 6で動作するアプリがあります。Android 6 - プログラムファイルを別のフォルダにプログラムでコピーする

myFile =新しいファイル(getExternalFilesDir(ファイルパス)、MyData);

ファイルパス:/ストレージ/エミュレート/ 0 /アンドロイド/データ/ my_package /ファイル/ MY_FILE

私はこのファイルをコピーしたい

結果のファイルは次のようになります場所でありますAndroid/dataディレクトリの下に大量に埋め込まれていない新しいフォルダで、ユーザーはUSBケーブル経由で電話/タブレットに接続しているデータを簡単に見つけて取得できます。これまでのところ、私はこれを行う方法を理解することができませんでした...またはそれが可能な場合でも。私が試してみるものは、許可例外が発生するようです。

可能であれば、このフォルダは〜/ Android/dataと同じレベルにします。そうでない場合、選択肢はありますか?データをSDカードに保存するなど。

私はAndroidファイルシステムの多くの記事と記事を読んできました。それはすべて非常に混乱し、曖昧です。 Androidの新しいバージョンでは、動作の仕方が変わるようです。 Android 6(Marshmallow)に関連する明快で簡潔な説明を誰かが知っている場合(多分実際の例でも!)私に教えてください。

ありがとう、最大

+0

マシュマロは、ランタイムチェックイン時にパーミッションをチェックする必要があり、このhttps://developer.android.com/training/permissions /requesting.html – Nakul

答えて

0

からマニフェストからプロセスの下で与えられただけで、他のAndroid OSのpermossion 6.0のために付与されるの権限を削除いけません。 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(); 
      } 
    } 
} 

これは許可例外を通過したものの、既定のアプリケーションディレクトリの外にフォルダを作成する方法には答えられませんでした。次のコードは、アクセス権を取得し、デバイスストレージの最上位に表示されるAppDataと呼ばれる/ storage/emulated/0にフォルダを作成します。アクセス要求コードWFileRequestはAdeel Turkの例のように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はセキュリティ上の理由から実行時アクセス許可を取得するように制限されています。したがって、次のコードは許可を得るのに役立ちます。

NOTEは、私はAdeelトルコからの許可の提案を使用したマニフェスト

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

関連する問題