我正进入(状态
开放失败:
EACCES (Permission denied)
在线上 OutputStream myOutput = new FileOutputStream(outFileName);
我检查了根,我试过了android.permission.WRITE_EXTERNAL_STORAGE.
我该如何解决这个问题?
try {
    InputStream myInput;
    myInput = getAssets().open("XXX.db");
    // Path to the just created empty db
    String outFileName = "/data/data/XX/databases/"
            + "XXX.db";
    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);
    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }
    // Close the …android android-permissions android-5.0-lollipop android-storage
我试图更好地了解 Android 11 版本发布后我将能够做什么。
我的应用程序使用提供的图像的文件路径Environment.getExternalStorageDirectory()来创建照片相册,但使用Android 11 我将无法直接访问 files。
根据Android开发人员文档,他们最近引入了该MANAGE_EXTERNAL_STORAGE权限,但我不明白添加此权限是否可以继续访问文件Environment。
有没有人有想法???
谢谢
2021 年 1 月更新
我在 Android 11 虚拟设备上尝试了我的应用程序,即使没有请求MANAGE_EXTERNAL_STORAGE许可,它似乎也能完美运行!
阅读 Android Developers 上的文档,似乎使用FILEAPI 仅访问照片和媒体位置的应用程序可以继续工作,但我不确定。
有没有人更了解Android文档???
android file android-developer-api android-storage android-11
如何从内部存储中删除文件夹(包含一些文件夹和文件)?文件夹下面有一些树.
folder
|_________  C2 (folder)
             |________1 (folder)
                      |________1.gif
                      |________2.gif
                      |________3.gif
                      |________4.gif
             |________2 (folder)
                      |________1.gif
                      |________2.gif
                      |________3.gif
                      |________4.gif
             |________3 (folder)
                      |________1.gif
                      |________2.gif
                      |________3.gif
                      |________4.gif
             |________4 (folder)
                      |________1.gif
                      |________2.gif
                      |________3.gif
                      |________4.gif
             |________5 (folder)
                      |________1.gif
                      |________2.gif
                      |________3.gif
                      |________4.gif
|_________  C2.xml (file)
我想删除文件夹并包含所有文件
fil.delete();
System.out.println("boolean =>" + fil.delete());
但上面的代码显示为false.请帮忙.
了解到 Android 11 有范围存储,但我找不到任何信息,如何在 中创建和使用文件夹/storage/emulated/0/?旧方法仅适用于 api 29 及以下版本:(
我正在使用 PDF.js 在我的 Android 应用程序中显示 PDF 文件。在 Android 10 之前,它可以正常工作,但从“targetSdkVersion 30”开始,它就不再工作了。
如果我想打开并显示 PDF 文件,PDF.js 显示
Missing PDF "file:///storage/emulated/0/Android/data/<App-ID>/files/file.pdf
路径绝对正确,我检查了它并使用它生成了它getExternalFilesDir(null).absolutePath
要加载的整个 URL 是
file:///android_asset/web/viewer.html?file=/storage/emulated/0/Android/data/<app-ID>/files/file.pdf
使用“targetSdkVersion 29”并且不更改任何其他内容,一切正常,因此似乎“targetSdkVersion 30”在某种程度上导致了问题。
我想列出下载文件夹中的所有文件.txt,然后允许用户选择一个并阅读其内容。我的是,但我遇到了这个问题,因为我的 Android 是 Q (29)。minSdkVersion16
我试过的:
显然Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)会为 SDK <= 29 解决它。但是,我没有测试它,因为我想首先查看 Android Q 的解决方案。
getExternalStoragePublicDirectory说:
当应用以 Build.VERSION_CODES.Q 为目标时,应用无法再直接访问从此方法返回的路径。通过迁移到Context#getExternalFilesDir(String)、MediaStore或Intent#ACTION_OPEN_DOCUMENT等替代方案,应用程序可以继续访问存储在共享/外部存储上的内容。
所以:
getExternalFilesDir返回/storage/emulated/0/Android/data/com.mypackage/files/Download。这个路径没有用,我希望它返回/storage/emulated/0/Download,这是下载文件所在的位置。
我没有设法对MediaStore.Downloads. 我检查了文档,它说“特别是,如果您的应用程序想要访问您的应用程序未创建的 MediaStore.Downloads 集合中的文件,则必须使用存储访问框架。”。所以,我认为它对我不起作用。
在我的概念,Intent并且Storage Access Framework需要用户通过目录和使用文件管理器,它是不是文件浏览什么,我想在这里。
简而言之:
是否可以在 Android Q (SDK >= 29) 中以编程方式列出.txt下载的文件?如果是这样,如何?
我的活动需要向文档提供者请求新文档。
我想在我的 espresso 测试中通过使用 uri 来测试活动结果。但是,返回的 uri 没有授予正确的权限。至少SecurityException: No persistable permission grants found for [user] and [uri]当我尝试时我得到了takePersistableUriPermission
我在 onActivityResult 活动的相关代码:
val takeFlags = data.getFlags() and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
contentResolver.takePersistableUriPermission(it, takeFlags)
espresso 测试的相关代码
val file = File(InstrumentationRegistry.getTargetContext().filesDir, "abc.txt2)
val uri = Uri.parse("file://" + file.absoluteFile)
Intents.intending(hasAction(Intent.ACTION_CREATE_DOCUMENT))
            .respondWith(Instrumentation.ActivityResult(RESULT_OK, Intent().setData(uri)))
 <click on button to request document>
如何使用带有授予权限的 uri 来意图活动结果?
UPDATE
我有运行8.0.0 T-Mobile的三星Galaxy S8 +,它在运行8.0.0时运行良好
我的三星Galaxy S9 +运行8.0.0 Verizon,每次都有非法参数失败.
我的三星Galaxy S9 +运行8.0.0 T-Mobile没有问题,工作正常
所以这可能是OEM特定的型号问题,但不知道如何解决它.我也试过重启电话,没有改变结果.
此外,我从Evernote中打开了公共下载并将文件保存为Note的附件,这告诉我Evernote能够正常访问公共目录并附加文件,因此可以在设备上执行.让我相信它与代码相关.
所以我最近升级了一个工作得很好的项目,现在它已经出现了一个错误,它正在使用构建工具28进行编译,用于最新版本的Android.
所以我一直使用这个PathUtil从隐含的意图中获取我需要的文件路径,以便从用户那里获取文件.我将在下面分享我正在使用的代码的链接.
它只是一个实用程序类,它检查提供程序权限并获取您尝试读取的文件的绝对路径.
当用户从公共下载目录中选择一个文件时,它返回onActivityResult:
content://com.android.providers.downloads.documents/document/2025
现在,nice实用程序解析了这个并告诉我这是一个下载目录文件,并且是一个id为2025的文档.感谢实用程序,这是一个很好的开始.
接下来是使用内容解析器来查找文件绝对路径.这是以前的工作,但不再是:(.
现在路径实用程序只使用他们最有可能从核心库本身获得的合同数据.我试图导入提供程序类以避免静态字符串,但它似乎不可用,所以我想简单地使用匹配字符串是现在最好的方法.
以下是提供内容解析器所有访问权限的核心DownloadProvider供参考. DownloadProvider
注*此DownloadProvider是Androids,不是我的
以下是为contentProvider构建Uri的代码
 val id = DocumentsContract.getDocumentId(uri)
 val contentUri = ContentUris.withAppendedId(Uri.parse(PUBLIC_DOWNLOAD_PATH), id.toLong())
 return getDataColumn(context, contentUri, null, null)
来电参考:
    private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array<String>?): String? {
        var cursor: Cursor? = null
        val column = "_data"
        val projection = arrayOf(column)
        try {
            cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
            if …我曾经使用以下代码将原始声音文件保存到外部存储并将其设置为铃声。但事情似乎在 android 10 中发生了变化。你能帮助我或向我展示一些如何更新我的代码以使用 android 10 的指南吗?
这是将文件保存到外部存储的代码:
保存文件:
String path = Environment.getExternalStorageDirectory() + "/customsounds";
 public File getFile() {
        boolean exists = (new File(path).exists());
        if (!exists) {
            new File(path).mkdirs();
        }
        File newSoundFile = new File(path, sound.getFileName() + ".mp3");
        Uri mUri = Uri.parse("android.resource://com.example.customsounds/" + sound.getId());
        ContentResolver mCr = getContentResolver();
        AssetFileDescriptor soundFile;
        try {
            soundFile = mCr.openAssetFileDescriptor(mUri, "r");
        } catch (FileNotFoundException e) {
            soundFile = null;
        }
        try {
            byte[] readData = new byte[1024];
            FileInputStream fis = soundFile.createInputStream();
            FileOutputStream fos = new …上传到 Google Play 的所有新应用都必须针对 Android 10(API 级别 29)或更高版本。Environment.getExternalStorageDirectory()但是,当应用程序以 API 级别 29 为目标时,应用程序将无法再直接访问从返回的路径。
文档建议使用Context.getExternalFilesDir()(不适合我的用例,因为放置在那里的文件位于应用程序内部,并且在卸载应用程序时被删除)或MediaStore,记录在此处。
我陷入了以下片段:
// Find all image files on the primary external storage device.
// On API <= 28, use VOLUME_EXTERNAL instead.
Uri collection = MediaStore.Images.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL_PRIMARY);
当我尝试支持 API <= 28 和 API >= 29 时,我尝试了以下操作:
    Uri collection;
    if (VERSION.SDK_INT >= VERSION_CODES.Q) {
        collection = MediaStore.Images.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL_PRIMARY);
    } else {
        collection = MediaStore.Images.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL);
    }
但是,我仍然收到需要 API 级别 29 的警告。MediaStore.VOLUME_EXTERNAL …
android ×10
android-storage ×10
android-11 ×2
kotlin ×2
android-10.0 ×1
android-file ×1
file ×1
java ×1
media ×1
pdf.js ×1
ringtone ×1