访问getExternalStorageDirectory

时间:2016-01-18 22:25:30

标签: android

使用一些非常简单的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。

我如何访问这些文件?

3 个答案:

答案 0 :(得分:10)

我在Marshmallow(6.0)中试过这个逻辑:

  1. 确保您的清单中有此内容:
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    1. 尝试访问外部存储空间时,请在输入读取目录的逻辑之前检查权限:

      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.
              }
          }
      }
      
    2. 然后在您的活动中覆盖此方法:

      @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
          }
      }
      
    3. 之后你终于可以在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卡。