标签: android-external-storage

Android - 相机权限被拒绝而没有提示

我遇到了请求权限背后的手动过程的问题(只是一直陷入'拒绝'代码),所以我切换到使用Dexter来简化.我在onCreate()中实现了以下代码,然后我对应用程序进行了全新安装:

Dexter.withActivity(this)
            .withPermission(Manifest.permission.CAMERA)
            .withListener(new PermissionListener() {
                @Override public void onPermissionGranted(PermissionGrantedResponse response) {
                    Log.d(TAG, "GRANTED!");
                    initCamera();
                }
                @Override public void onPermissionDenied(PermissionDeniedResponse response) {
                    Log.d(TAG, "DENIED!");
                }
                @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                    Log.d(TAG, "PERMISSION RATIONAL SHOULD BE SHOWN!");

                }
            }).check();
Run Code Online (Sandbox Code Playgroud)

它立即陷入"拒绝!" 记录,它甚至从未提示过我.我尝试了这个特定的代码来尝试多个权限(这最终是我需要做的):

Dexter.withActivity(activity)
            .withPermissions(Manifest.permission.CAMERA,
                    Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    Log.d(TAG, "Accepted: " + report.getGrantedPermissionResponses().size() + " | Denied: " + report.getDeniedPermissionResponses().get(0).getPermissionName());
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                    Log.d(TAG, "continuing …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-external-storage

8
推荐指数
1
解决办法
2221
查看次数

Android 10 (api 29) 中没有这样的文件或目录

我正在开发一个照片编辑器应用程序,在编辑我的图片后,我将它保存到我的本地存储中。它在 android 9 之前工作正常,但在 android 10 上没有。它在 Android 10 中显示“未找到此类文件或目录”的异常。经过一些研究,我发现 getExternalFilesDir() 在 android Q+ 中已弃用。但是我在 android 10 中找不到任何正确的方法来做到这一点。所以如果有人可以提供教程,那将非常有帮助。

我已经添加并授予了使用权限 android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 以防它是问题,但它没有解决任何问题。

这是我的尝试(使用 ParcelFileDescriptor):

private void fileAccessForAndroidQ(Uri fileUri){
    try {
        ParcelFileDescriptor parcelFileDescriptor = this.getContentResolver().openFileDescriptor(fileUri, "r", null);
        InputStream inputStream = new FileInputStream(parcelFileDescriptor.getFileDescriptor());
        Cursor returnCursor =
                getContentResolver().query(fileUri, null, null, null, null);
        int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        returnCursor.moveToFirst();
        fileName = returnCursor.getString(nameIndex);

        file = new File(this.getFilesDir(), fileName);

        OutputStream outputStream = new FileOutputStream(file);
        IOUtils.copyStream(inputStream, outputStream);

    }catch (Exception e){
        Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

任何形式的帮助将不胜感激。

android file fileoutputstream android-external-storage android-10.0

8
推荐指数
1
解决办法
4870
查看次数

API 级别 &lt; 33 的 Android 权限 READ_MEDIA_AUDIO 和 READ_EXTERNAL_STORAGE

在 API 33 (Android 13) 中,引入了细粒度的媒体权限,开发人员必须请求这些细粒度的权限,而不是READ_EXTERNAL_STORAGE.

READ_MEDIA_AUDIO就是这样一种细粒度的权限。此权限仅存在于 API 级别 33+ 中,所以我的问题是,我应该在清单中请求哪个权限?

由于我的应用程序有minSDK = 21,我是否应该在清单中同时请求READ_EXTERNAL_STORAGE和。READ_MEDIA_AUDIO或者我应该只提出请求READ_EXTERNAL_STORAGE并且这将涵盖READ_MEDIA_AUDIO?(当然,在运行时,我会根据SDK_INT设备请求任一权限。)

android android-permissions android-external-storage

8
推荐指数
1
解决办法
7042
查看次数

PermissionAndroid.request() 总是返回 never_ask_again 且没有任何提示。反应本机

我已经尝试了大多数问题的结果,但没有一个对我有用。我尝试使用 PermissionAndroid.request 方法访问 WRITE_EXTERNAL_STORAGE 权限,但它总是返回 never_ask_again 作为结果。

我的请求文件:

try {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
          {
            title: 'External Storage Write Permission',
            message: 'App needs write permission',
          },
        );

        console.log(granted);
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
          // Start downloading
          downloadFile();
          console.log('Storage Permission Granted.');
        } else {
          // If permission denied then show alert
          Alert.alert('Error', 'Storage Permission Not Granted');
        }
      } catch (err) {
        // To handle permission related exception
        console.log('++++' + err);
      }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的 AndroidManifest.xml 文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-permission android:name="android.permission.INTERNET" …
Run Code Online (Sandbox Code Playgroud)

android android-external-storage react-native react-native-permissions

8
推荐指数
1
解决办法
5110
查看次数

android java.io.File.fixSlashes(File.java:185)

我在控制台崩溃和anrs中出错了.有时会出现此错误,我无法找到问题所在.

java.lang.NullPointerException
at java.io.File.fixSlashes(File.java:185)
at java.io.File.<init>(File.java:134)
Run Code Online (Sandbox Code Playgroud)

保存图片的功能代码是:

    public static String sharePhoto(Context context, Bitmap bmp) {
    File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Folder");
    boolean success = true;
    String file_path = null;
    if (!folder.exists()) {
        success = folder.mkdir();
    }
    if (success) {
            file_path = folder + "/Img_" + System.currentTimeMillis() / 1000 + ".jpg";
        }
        OutputStream os = null;
        try {
            os = new FileOutputStream(file_path);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, os);
        } catch (IOException e) {
           e.printStackTrace();
        }
    } else {
        // Do something else on …
Run Code Online (Sandbox Code Playgroud)

java android file android-external-storage

7
推荐指数
1
解决办法
3779
查看次数

如何处理Activity和Fragment之外的权限请求?

我正在开发一个需要访问外部存储的自定义复合视图.如何在不涉及外部各方(即活动或片段)的情况下实施权限处理?

我知道我可以使用View的上下文请求权限,但是我如何处理onRequestPermissionsResult()View内部?它甚至可能吗?

如果不可能,处理这样的事情最优雅的解决方案是什么?

android android-custom-view android-permissions android-external-storage android-6.0-marshmallow

7
推荐指数
1
解决办法
4388
查看次数

使用 MTP 通过 Android Storage Access Framework/DocumentProvider 遍历目录层次结构的问题

更新:我最初的问题可能具有误导性,所以我想重新表述它:我想通过 Android 的存储访问框架从 MTP 连接的设备遍历层次树。我似乎无法实现这一点,因为我得到一个SecurityException声明,即子节点不是其父节点的后代。有没有办法解决这个问题?或者这是一个已知问题?谢谢。

我正在编写一个 Android 应用程序,该应用程序尝试使用 Android 的存储访问框架 (SAF) 通过MtpDocumentsProvider. 我或多或少遵循https://github.com/googlesamples/android-DirectorySelection 中描述的代码示例,了解如何从我的应用程序启动 SAF Picker,选择 MTP 数据源,然后在onActivityResult中使用返回Uri的遍历层次结构。不幸的是,这似乎不起作用,因为一旦我访问一个子文件夹并尝试遍历它,我总是得到一个SecurityException说明document xx is not a descendant of yy

所以我的问题是,使用MtpDocumentProvider,如何从我的应用程序成功遍历层次结构树并避免此异常?

具体来说,在我的应用程序中,我首先调用以下方法来启动 SAF Picker:

private void launchStoragePicker() {
    Intent browseIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    browseIntent.addFlags(
        Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
            | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
            | Intent.FLAG_GRANT_READ_URI_PERMISSION
            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
    );
    startActivityForResult(browseIntent, REQUEST_CODE_OPEN_DIRECTORY);
}
Run Code Online (Sandbox Code Playgroud)

然后 Android SAF 选择器启动,我看到我连接的设备被识别为 MTP 数据源。我选择了上述数据源,然后Uri从我的onActivityResult

@Override
public void onActivityResult(int requestCode, …
Run Code Online (Sandbox Code Playgroud)

android mtp android-external-storage storage-access-framework document-provider

7
推荐指数
1
解决办法
2455
查看次数

将视频插入图库 [Android Q]

要录制SurfeceView我使用的 3rd-party library,该库需要一个路径,其中保存在我的案例中的输出(录制的视频)是savedVideoPath

 mRenderPipeline = EZFilter.input(this.effectBmp)
                    .addFilter(new Effects().getEffect(VideoMaker.this, i))
                    .enableRecord(savedVideoPath, true, false)
                    .into(mRenderView);
Run Code Online (Sandbox Code Playgroud)

录制停止后,视频应该以savedVideoPath为路径保存,当我测试代码时,也就是说,当我打开图库应用程序时,我在那里看到保存的视频,但是当我在Android Q上测试时,我什么也看不见。

由于getExternalStoragePublicDirectorygetExternalStorageDirectory已弃用,我尝试使用getExternalFilesDir如下:

private void getPath() {
        String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";
        fileName = videoFileName;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            File imageFile = null;
            File storageDir = new File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), "Folder");
            source = storageDir;
            boolean success = true;
            if (!storageDir.exists()) {
                success = storageDir.mkdirs();
            }
            if (success) {
                imageFile = new File(storageDir, …
Run Code Online (Sandbox Code Playgroud)

java android android-mediascanner android-external-storage android-10.0

7
推荐指数
2
解决办法
5456
查看次数

为什么在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE

我使用 DownloadManager 下载照片并将其保存到外部图片目录:

.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, File.separator + filename)
Run Code Online (Sandbox Code Playgroud)

Marshmallow 需要 WRITE_EXTERNAL_STORAGE(如预期),但在 Android Q 及更高版本上,它无需许可即可正常工作。为什么会这样?是因为范围存储吗?

android android-permissions android-download-manager android-external-storage scoped-storage

7
推荐指数
1
解决办法
2111
查看次数

Android 11 - 访问我的应用程序 Android/Data 文件夹中的文件

由于某种原因,我真的很挣扎,希望有人能帮助我指明正确的方向。

我的目标是 Android 11 / API 30,这似乎是所有问题的根源。降低目标可能对我有用——但谷歌似乎最终会迫使我走上这条路,所以我不妨弄清楚这一点。

我的应用程序通常会按照标准写入文件

getExternalFilesDir(null)
Run Code Online (Sandbox Code Playgroud)

这给了我设备上的一条路径

/storage/emulated/0/Android/data/com.domain.testapp/files
Run Code Online (Sandbox Code Playgroud)

我还尝试了其他类型,例如:

getExternalFilesDir(Environment.DIRECTORY_PICTURES)
Run Code Online (Sandbox Code Playgroud)

结果是

/storage/emulated/0/Android/data/com.domain.testapp/files/Documents
Run Code Online (Sandbox Code Playgroud)

我的应用程序实际上将文件写入此位置没有任何问题。在 Android 11 中,我必须使用本地文件浏览器跳过一些麻烦才能查看这些文件 - 但它们确实存在于设备上。

我现在试图为用户提供一些查看文件和共享文件的能力,这就是我所困惑的地方!

下面的代码导致找不到文件

File filePath = this.getExternalFilesDir(null);
String filePathString = filePath.toString();

ArrayList<String> myData = new ArrayList<>();
File fileDir = new File(filePathString);

String[] files = fileDir.list();

if(files.length == 0){
    Log.w(APPID, "NO FILES IN FOLDER");
}
Run Code Online (Sandbox Code Playgroud)

是的 - 我知道不需要 File 和 .toString() - 但我每一步都将它们注销,因为我认为我疯了。

我知道这个应用程序指向的文件夹中有十几个左右的文件。该应用程序创建了文件。不是应该能看到文件夹里的文件吗???

Manifest 具有以下权限 - 我认为它不需要全部:

<uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

没有权限显示为应用程序被拒绝

我想过使用外部存储 - 但似乎这在 Android …

android file android-external-storage android-11

7
推荐指数
1
解决办法
3万
查看次数