0

Ich habe https://github.com/afollestad/material-dialogs bezeichnet und es hat Code, um Ordner auszuwählen und seinen Pfad über die Anwendung zu erhalten. Im Anschluss an sich umgesetzt ich unten Code:Ordner Pfad für Kopierdaten über UI noch EACCES (Berechtigung verweigert)

Wichtig Ich bin immer diese Fehlermeldung auf Asus Zenphone 5 läuft auf KitKat API 19.

package jss.folderselector; 

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.afollestad.materialdialogs.folderselector.FolderChooserDialog; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

public class MainActivity extends AppCompatActivity implements FolderChooserDialog.FolderCallback { 
    TextView path; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button foldersel, copy; 


     foldersel = (Button) findViewById(R.id.folder); 
     copy = (Button) findViewById(R.id.copy); 
     path = (TextView) findViewById(R.id.path); 

     foldersel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       showFolderChooser(); 
      } 
     }); 

     copy.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       moveFile("/sdcard/Download/a.apk",path.getText().toString()+"/a.apk"); 
      } 
     }); 

    } 

    public void showFolderChooser() { 

     if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
       PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      return; 
     } 
     new FolderChooserDialog.Builder(MainActivity.this) 
       .chooseButton(R.string.md_choose_label) 
       .allowNewFolder(true, 0) 
       // changes label of the choose button 
       .initialPath("/sdcard/Download") // changes initial path, defaults to external storage directory 
       .tag("optional-identifier") 
       .goUpLabel("Up") // custom go up label, default label is "..." 
       .show(); 
    } 

    @Override 
    public void onFolderSelection(@NonNull com.afollestad.materialdialogs.folderselector.FolderChooserDialog dialog, @NonNull File folder) { 
     Toast.makeText(this, folder.getAbsolutePath(), Toast.LENGTH_SHORT).show(); 
     path.setText(folder.getAbsolutePath()); 
     final String tag = dialog.getTag(); // gets tag set from Builder, if you use multiple dialogs 
    } 

    @Override 
    public void onFolderChooserDismissed(@NonNull FolderChooserDialog dialog) { 

    } 

    public void moveFile(String s, String d) { 
     InputStream inStream = null; 
     OutputStream outStream = null; 

     try { 

      File afile = new File(s); 
      File bfile = new File(d); 

      inStream = new FileInputStream(afile); 
      outStream = new FileOutputStream(bfile); 

      byte[] buffer = new byte[1024]; 

      int length; 
      //copy the file content in bytes 
      while ((length = inStream.read(buffer)) > 0) { 

       outStream.write(buffer, 0, length); 

      } 

      inStream.close(); 
      outStream.close(); 

      //delete the original file 
      afile.delete(); 

      System.out.println("File is copied successful!"); 
      //run(); 

     } catch (IOException e) { 
      e.printStackTrace(); 

     } 


    } 
} 

konnte ich die Lage Weg für MicroSD-Karte auszuwählen und festgelegt, dass als Ziel für das Kopieren Datei. Aber es ist fehlgeschlagen mit Permission Denied Error

Ich habe die Erlaubnis in Manifest für externe Speicher schreiben. Was muss noch repariert werden? Da ich gelesen habe, dass wenn App einen Ordner über die Benutzeroberfläche wählen, App bekam die Erlaubnis zu schreiben, aber nicht für mich arbeiten.

Manifest-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="jss.folderselector"> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Fehlerprotokoll:

02-11 13:54:31.191 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Changed directory to /storage/emulated 
02-11 13:54:31.481 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Changed directory to /storage 
02-11 13:54:32.101 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Selected index: 0 
02-11 13:54:32.111 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Changed directory to /storage/MicroSD 
02-11 13:54:33.091 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Selected index: 6 
02-11 13:54:33.101 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Changed directory to /storage/MicroSD/WhatsAppold 
02-11 13:54:33.581 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Returning /storage/MicroSD/WhatsAppold as result 
02-11 13:54:33.581 28199-28255/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: FileObserver received event 32768 
02-11 13:54:33.601 28199-28199/net.rdrei.android.dirchooser.sample D/DirectoryChooserFragment: Changed directory to /storage/MicroSD/WhatsAppold 
02-11 13:54:33.601 28199-28199/net.rdrei.android.dirchooser.sample I/DirChooserSample: Return from DirChooser with result 1 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err: java.io.FileNotFoundException: /storage/MicroSD/WhatsAppold/a.apk: open failed: EACCES (Permission denied) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:409) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at net.rdrei.android.dirchooser.sample.DirChooserSample.moveFile(DirChooserSample.java:109) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at net.rdrei.android.dirchooser.sample.DirChooserSample$3.onClick(DirChooserSample.java:76) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at android.view.View.performClick(View.java:4478) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at android.view.View$PerformClick.run(View.java:18698) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at android.os.Handler.handleCallback(Handler.java:733) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at android.os.Looper.loop(Looper.java:149) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5257) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err: Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at libcore.io.Posix.open(Native Method) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:393) 
02-11 13:54:35.601 28199-28199/net.rdrei.android.dirchooser.sample W/System.err: ... 15 more 

Bild für Pfad auf mobilen Mobile SDCARD Path

+0

Bitte fügen Sie Ihre Permission oder Menifest-Datei –

+0

'haben Erlaubnis in Manifest für externe Speicher schreiben'. Das wird für Marshmellow und darüber nicht ausreichen. – greenapps

+0

'Ich konnte Pfad für MicroSD-Karte auswählen. Der in Ihrem Stacktrace angegebene Pfad existiert nicht. Nicht auf einem einzelnen Android-Gerät. (Oder anders sagen, welches Gerät). Du hast es mir unmöglich gemacht, diesen Weg zu kopieren! – greenapps

Antwort

0
I could able to pick path for MicroSD card. 

/Removable/MicroSD/....... 

Der Pfad in Ihrem Stacktrace existiert nicht. Nicht auf einem einzelnen Android-Gerät. (Oder anders sagen, welches Gerät). (Sie haben es mir unmöglich gemacht, diesen Pfad zu kopieren, während Sie ein Bild gepostet haben!)

Auf modernen Android-Systemen können Sie nicht auf eine SD-Karte schreiben. Außer für private Verzeichnisse in Ihrer App.

+0

ref angehängt Bild für den Weg von mobilen Asus Zenfone5 – Panache

+0

Warum sagen Sie nicht, dass tatsächlich '/ MicroSD/WhatsAppold', wie Sie zuerst gepostet, existiert nicht, aber es sollte'/Speicher/MicroSD/WhatsAppold/a.apk' sein stattdessen ? Welcher indead aussieht wie ein Pfad, der existieren kann. Wenn du das merkst, dann solltest du auch wissen, dass der screendump mit '> root> Removable> MicroSD> WhatsAppold' ein nicht existierender nicht benutzbarer Pfad ist, der nicht den echten Pfad wie'/storage/MicroSD/WhatsAppold' angibt. Sie verwenden besser einen Dateimanager, der Ihnen den echten Pfad angibt. – greenapps

+0

Also, was ist die Lösung jetzt, Sie haben einen echten Pfad vom Dateimanager und vom Fehlerprotokoll. Beratung jetzt. Ich bin hier fest stecken – Panache

0

Da Sie KitKat verwenden, die API 19 ist, müssen Sie die implizit deklarieren READ_EXTERNAL_STORAGE Erlaubnis im Manifest. Als Dokumentation vorschlagen:

Diese Berechtigung Ausgang in API-Ebene 19. Vor API-Ebene 19, diese Berechtigung nicht erzwungen erzwungen wird und alle Anwendungen nach wie vor Zugriff aus dem externen Speicher zu lesen. Sie können Ihre App mit der erzwungenen Berechtigung testen, indem Sie unter Entwickleroptionen in der App Einstellungen auf einem Gerät mit Android 4.1 oder höher die Option USB-Speicher schützen aktivieren.

Aber denken Sie daran, wenn Sie API über 19 Targeting werden, und wenn Sie nur WRITE_EXTERNAL_STORAGE in Ihrem Manifest hinzufügen es wird automatisch die READ_EXTERNAL_STORAGE während Buildzeit hinzufügen, deshalb brauchen Sie nicht die zusätzliche Leseberechtigung. Aber in Ihrem Fall müssen Sie es haben, da Sie auf 19 und niedriger zielen.

+0

Leserechte im Manifest hinzugefügt, immer noch der selbe Fehler. – Panache

Verwandte Themen