无法访问sdcard/上的子文件夹中的文件在Android 13(三星galaxy s22)

oxf4rvwz  于 2023-02-17  发布在  Android
关注(0)|答案(1)|浏览(493)

我在/sdcard/我的文件夹/文件名. txt中有一个文件
我在源代码中访问此文件,如下所示:

File fileMyTextFile = new File("/sdcard/myfolder/file.txt");

有一次,我在打开文件读取其数据之前检查文件是否存在:

try {
            if (fileMyTextFile.exists()) {
              ...
            }
        } catch (FileNotFoundException e) {
            Log.d("MyApp", "file not found");
            e.printStackTrace();
        }

当我的代码到达这一点时,我一直收到FileNotFoundException。同样的代码在我的其他Android版本较低的手机中不需要任何更改就可以工作,所以我认为这一定与应用权限有关。
我已经在AndroidManifest.xml中声明了这些

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

我也有

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:requestLegacyExternalStorage="true"
    tools:ignore="AllowBackup,GoogleAppIndexingWarning">
    ....

在www.example.com中MainActivity.java我也这样做了:

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, MY_PERMISSIONS_REQUEST );

如何在android 13中访问我的自定义文件?

gj3fmq9x

gj3fmq9x1#

对于Android 13,request all files permissions必须在运行时显示。下面的代码当然不是完整的代码,但主要需要在onCreate中请求request all files权限
主要活动:

public static final int STORAGE_PERMISSION = 0,
            ALL_FILES_PERMISSION = 2;

private void checkForExternalPermission() {
  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
    requestAllFilesAccess(this);
  }
}

public void requestAllFilesAccess(@NonNull final OnPermissionGranted onPermissionGranted) {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setTitle("Grant all files permissions!");
    alertDialogBuilder.setMessage("You need to grant all files permission");
    alertDialogBuilder.setCancelable(false);

    alertDialogBuilder.setPositiveButton("Grant", (dialog, id) -> {

        permissionCallbacks[ALL_FILES_PERMISSION] = onPermissionGranted;
        try {
          Intent intent =
            new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
            .setData(Uri.parse("package:" + getPackageName()));
          startActivity(intent);
        } catch (Exception e) {
          Log.e("MainActivity", "Failed to initial activity to grant all files access", e);
          Toast.makeText(this, "Failed to grant permissions", Toast.LENGTH_SHORT).show();
        }

        this.finish();
      })

      .setNegativeButton("Cancel", (dialog, id) -> dialog.cancel());

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
  }
}

相关问题