使用一些非常简单的Android代码我试图根据以下逻辑访问文件夹:
public void try_to_navigate_local_dir(){
Environment e = new Environment();
ArrayList<String> filesList = new ArrayList<String>();
String sd_card = Environment.getExternalStorageDirectory().toString() + "/subdir_x";
File file = new File( sd_card ) ;
File list[] = file.listFiles();
for( int i=0; i< list.length; i++) {
filesList.add( list[i].getName() );
}
}
我的手机上的其他应用程序创建了subdir_x
。
我可以使用文件管理器在这些文件夹中查看,但当我尝试file.listFiles()
时,我的代码返回null。
我如何访问这些文件?
答案 0 :(得分:10)
我在Marshmallow(6.0)中试过这个逻辑:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
尝试访问外部存储空间时,请在输入读取目录的逻辑之前检查权限:
public void checkPermissionReadStorage(Activity activity){
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_STORAGE);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
}
然后在您的活动中覆盖此方法:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionManager.MY_PERMISSIONS_REQUEST_READ_STORAGE: {
//premission to read storage
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(SnapSellAddActivity.this, "We Need permission Storage", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
之后你终于可以在android设备中读取外部存储了,我试过这个方法来读取外部存储中的目录:
public File getPreviewTempExternalDirectory(Context context) {
File previewDir = new File(context.getExternalFilesDir(null), PLACE YOUT DIR HERE);
if (!previewDir.exists()) previewDir.mkdir();
return previewDir;
}
现在你有了目录,你可以在那里列出文件或创建文件。希望它有所帮助。
答案 1 :(得分:3)
在Marshmallow之前,请关注@Cory Charlton的回答。然而他对Android Marshmallow(6.0)的回答却无法奏效。
实际上,从Android 6.0(API级别23)开始,我们不再拥有以下权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
如需了解更多信息,请提出以下问题:
顺便说一下,Environment e = new Environment();
没用,删除它。
答案 2 :(得分:0)
确保您的i--
拥有相应的权限:
AndroidManifest.xml
下一个问题可能是您的文件名。我在我的一个应用程序中使用以下内容并且它可以工作(请注意尾部斜杠和缺少前导斜杠):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
下一个问题可能是directory = new File(Environment.getExternalStorageDirectory(), "Subdirectory/")
final File[] files = directory.listFiles();
给你的路径。较新的设备在内部存储上有一个模拟SD卡的分区,Environment.getExternalStorageDirectory()
可以返回此分区,而不是真正的SD卡。