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
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
Bitte fügen Sie Ihre Permission oder Menifest-Datei –
'haben Erlaubnis in Manifest für externe Speicher schreiben'. Das wird für Marshmellow und darüber nicht ausreichen. – greenapps
'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