2016-11-08 4 views
0

J'ai une application fonctionnant sous Android 6 qui diffuse des données depuis un périphérique BLE. Cela fonctionne correctement lorsque vous utilisez quelque chose comme:Android 6 - Copier par programme un fichier d'application dans un autre dossier

myFile = nouveau fichier (getExternalFilesDir (chemin de fichier), MyData);

Le fichier résultant est à un endroit qui ressemble à:

Filepath:/stockage/émulé/0/Android/data/my_package/fichiers/mon_fichier

Je voudrais copier ce fichier un nouveau dossier qui n'est pas enterré dans la masse sous le répertoire Android/data afin qu'un utilisateur puisse facilement trouver et récupérer les données se connectant à un téléphone/tablette via le câble USB. Jusqu'ici, j'ai été incapable de comprendre comment faire ceci ... ou si c'est même possible. Tout ce que j'essaie semble aboutir à une exception d'autorisation.

Je souhaite que ce dossier soit au même niveau que ~/Android/data si possible. Si non, y a-t-il des alternatives? Comme mettre les données sur la carte SD. J'ai lu beaucoup de messages et d'articles sur le système de fichiers Android. Tout est très confus et vague. Et les nouvelles versions d'Android semblent changer la façon dont les choses fonctionnent. Si quelqu'un connaît une explication claire et concise par rapport à Android 6 (Marshmallow) (peut-être même avec des exemples de travail!) S'il vous plaît faites le moi savoir.

Merci, Max

+0

Marshmallow exige de vérifier l'autorisation d'exécution lors de l'enregistrement de cette https://developer.android.com/training/permissions /requesting.html – Nakul

Répondre

0

je la suggestion d'autorisation de Adeel Turk. Je n'ai pas eu besoin de vérifier la version de construction, puisque j'utilise seulement 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(); 
      } 
    } 
} 

Bien que cela a à travers les exceptions d'autorisation, il n'a pas répondu à la question de savoir comment créer un dossier en dehors du répertoire d'application par défaut. Le code suivant obtient l'autorisation et crée un dossier dans/storage/emulated/0 appelé AppData qui apparaît au niveau supérieur du stockage du périphérique. Le code de demande d'autorisation WFileRequest a été mis à 4 comme dans l'exemple d'Adeel Turk, mais je sais que vous pouvez utiliser n'importe quel nombre. Le rappel de demande d'autorisation vérifie ensuite le code de la demande et appelle à nouveau la routine copyFile avec le nom du fichier qui a été écrit à l'origine.

La plupart de ce code utilisé des exemples de quelques autres messages dans ce forum à how to create a folder in android External Storage Directory? et 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 pour obtenir courir restreint le temps permissionsfor des raisons de sécurité. Donc, le code suivant vous aidera à obtenir les autorisations.

NOTE Ne supprimer les autorisations de manifester le processus ci-dessous est juste pour 6.0 pour Android OS autre permossion sera accordée de manifeste

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

Beaucoup plus compliqué que ce à quoi je m'attendais! J'aurai besoin de temps pour travailler dessus et tester. Appréciez l'exemple de code car il semble couvrir certaines techniques qui ne sont pas bien présentées dans les pages Android Developer. – Max

+0

merci beaucoup, vous pouvez apprécier en votant ma réponse si vous voulez: D –

+0

Je voudrais upvote, mais j'ai besoin de plus de points pour le faire. Désolé à ce sujet, votre réponse m'a fait pointer dans la bonne direction. – Max