Environment.getExternalStorageDir().list() returns 空
Environment.getExternalStorageDir().list() returns null
我的 MainActivity 中有以下代码。
Log.d("FILES", Environment.getExternalStorageDirectory().getAbsolutePath());
Log.d("FILES", Environment.getRootDirectory().getAbsolutePath());
Log.d("FILES", Arrays.toString(Environment.getRootDirectory().list()));
Log.d("FILES", Arrays.toString(Environment.getExternalStorageDirectory().list()));
Log.d("FILES", Environment.getExternalStorageState());
Log.d("FILES", String.valueOf(Environment.getExternalStorageDirectory().listFiles() != null));
aboce 代码在 logcat 中显示了这样的输出:
12-28 08:38:51.344 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: /storage/emulated/0
12-28 08:38:51.344 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: /system
12-28 08:38:51.344 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: [lost+found, app, bin, build.prop, data, etc, fonts, framework, lib, media, plugin, preloadres, priv-app, recovery-from-boot.p, res, tts, usr, vendor, xbin]
12-28 08:38:51.347 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: null
12-28 08:38:51.353 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: mounted
12-28 08:38:51.356 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: false
我不知道为什么我不能在 getExternalStorageDir 下列出文件。根据 this 问题的公认答案,这应该可行。我的清单中有以下权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我已经在物理设备和模拟器上使用 API 23.
进行了测试
在 Android 6.0(API 级别 23)中,用户在应用 运行ning 时向应用授予权限,而不是他们安装了应用程序。
注意:API 23 后,在清单中提及权限将不起作用,您需要在 运行 时间内请求权限。
请关注本官方linkhere
askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE,100);
请求用户许可的方法
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
为了处理权限请求的结果,调用了 onRequestPermissionsResult
方法。它的代码如下:
注意:当返回结果时,它检查权限是否被授予。如果是,则传递 requestCode。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED) {
//permission granted
} else {
//Permission Denied
}
}
我的 MainActivity 中有以下代码。
Log.d("FILES", Environment.getExternalStorageDirectory().getAbsolutePath());
Log.d("FILES", Environment.getRootDirectory().getAbsolutePath());
Log.d("FILES", Arrays.toString(Environment.getRootDirectory().list()));
Log.d("FILES", Arrays.toString(Environment.getExternalStorageDirectory().list()));
Log.d("FILES", Environment.getExternalStorageState());
Log.d("FILES", String.valueOf(Environment.getExternalStorageDirectory().listFiles() != null));
aboce 代码在 logcat 中显示了这样的输出:
12-28 08:38:51.344 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: /storage/emulated/0
12-28 08:38:51.344 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: /system
12-28 08:38:51.344 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: [lost+found, app, bin, build.prop, data, etc, fonts, framework, lib, media, plugin, preloadres, priv-app, recovery-from-boot.p, res, tts, usr, vendor, xbin]
12-28 08:38:51.347 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: null
12-28 08:38:51.353 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: mounted
12-28 08:38:51.356 23429-23429/com.tahsinalsayeed.codeviewer D/FILES: false
我不知道为什么我不能在 getExternalStorageDir 下列出文件。根据 this 问题的公认答案,这应该可行。我的清单中有以下权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我已经在物理设备和模拟器上使用 API 23.
进行了测试在 Android 6.0(API 级别 23)中,用户在应用 运行ning 时向应用授予权限,而不是他们安装了应用程序。
注意:API 23 后,在清单中提及权限将不起作用,您需要在 运行 时间内请求权限。
请关注本官方linkhere
askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE,100);
请求用户许可的方法
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
为了处理权限请求的结果,调用了 onRequestPermissionsResult
方法。它的代码如下:
注意:当返回结果时,它检查权限是否被授予。如果是,则传递 requestCode。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED) {
//permission granted
} else {
//Permission Denied
}
}