- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
ContextCompat.getExternalFilesDirs(context, null)说:
Returns absolute paths to application-specific directories on all external storage devices where the application can place persistent files it owns.
例如,运行 Android 5.1.1 的 Huawei Honor 从该方法返回以下内容:
/storage/emulated/0/Android/data/my.package.name/files
/storage/sdcard1/Android/data/my.package.name/files
第二个目录是可移动的sd卡。但是,如果我尝试读取或写入该目录,则会出现异常:android.system.ErrnoException: open failed: EACCES (Permission denied)
该应用确实有 WRITE_EXTERNAL_STORAGE
。这在运行 Android 4.4.4 的三星 Galaxy Note 4 上工作得很好。这与Android 6.0的可选权限无关,因为这是在5.1.1上显示的问题。
API 说应用程序可以放置它拥有的持久文件
,但事实并非如此。
我也听说过其他设备的报告,包括更现代的三星设备。这仅仅是 OEM 没有正确实现这一点,还是我在 Android 的复杂存储框架中遗漏了什么?
这里有一些代码可以在此设备和一些设备上演示这一点。
File removable = ContextCompat.getExternalFilesDirs(context, null)[1];
if (removable.exists() && removable.canRead() && removable.canWrite()) {
File test = new File(removable, "test");
test.createNewFile(); // Throws the exception mentioned above
}
在该目录中创建、移动、mkdir 文件的任何尝试均失败。
最佳答案
好吧,我将您的代码包装在这个 Activity 中:
package com.commonsware.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
if (removable.exists() && removable.canRead() && removable.canWrite()) {
File test = new File(removable, "test");
try {
test.createNewFile(); // Throws the exception mentioned above
}
catch (IOException e) {
Log.e(getClass().getSimpleName(), "Exception creating file", e);
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
}
它在运行 Android 6.0.1 的华为荣耀 5X 上运行良好:
$ adb shell ls -al /storage/1A30-3598/Android/data/com.commonsware.myapplication/files
-rwxrwx--x u0_a29 sdcard_rw 0 2017-05-03 18:02 test
因此,我猜测这是设备特定的不兼容性。
关于android - 为什么有些 ContextCompat.getExternalFilesDirs 不可访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767777/
我正在尝试检查 SD 卡上的子目录结构是否存在; 如果没有,则创建一个新的。 那当然是在我的代码验证 SD 卡已安装并准备就绪之后。 我创建了有效的代码,并且成功地在我手机的 SD 卡上创建了结构,所
我在 getExternalFilesDir() 中存储了一些图像,我正试图在 android 图库 (cooliris) 中显示这些图像。现在我一直在这样做: Intent intent = new
我正在使用 Qt 5.13.0 和 androidextras 库。使用 QAndroidJniObject 我试图调用 Java 方法 context.getExternalFilesDir(nul
我的应用程序在 Play 商店上线,我注意到我在调用时没有询问权限: File savedImagesDirectory = getBaseContext.getExternalFilesDir("S
OnActivityCreated 我在做什么: activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); 在 logcat 中我得到
由于 google 终止了非常好的方法 getExternalStoragePublicDirectory,我必须尝试让 getExternalFilesDir 工作。 这是我尝试过的事情之一: pr
我用的安卓版本是4.2 我想通过这个获取存储文件的路径 String file = Environment.getExternalFilesDir() + "/"+title+".zip" 我收到这个
所以,基本上我有这段代码(所有功劳都归功于 mburhman 的文件资源管理器 - https://github.com/mburman/Android-File-Explore): private
在我的 android 应用程序中,我将一些文件保存到 Environment.getExternalStorageDirectory() + "\MyApp" 目录。在 android 6 mars
如标题所示,当我调用方法getExternalFilesDir(null)时,我得到了这样的警告:无法确保目录:/storage/emulated/0/Android/data/com.xxxx.ap
我的应用在 Android 5.0 上运行。我使用方法 getExternalFilesDirs() 来检查外部 SD 卡是否可用。如果它返回超过 1 个 File,则表示存在外部 SD 卡。 但在某
我正在尝试获取我的 c# xamarin android 应用程序的私有(private)外部存储目录的路径。微软文档告诉我们使用 Android.Content.Context.GetExterna
据我所知,使用 getFilesDir() 来存储数据(在我的例子中是相机捕获的数据)有点临时。我这么说是因为如果我关闭并重新打开应用程序,我可以访问目录和文件列表,但不能访问文件本身。 我的逻辑是错
我正在尝试存储用户可以使用我的应用程序下载的音乐文件,但我不希望它们对 99% 的用户公开可见(我不包括已获得 root 权限的设备或特殊情况) 我不担心那些不惜一切代价使用特殊工具或 root 手机
所以我遇到的问题如下, 以下代码行为我的应用程序的某些用户抛出 NullPointerException,但我不知道为什么 String state = Environment.getExternal
我想这是一个愚蠢的错误,但我无法控制自己...这是我的第一个 Android 应用程序。我试图在模拟 SD 卡上保存一些数据,以便用户可以轻松检索数据。 这个类应该将一些数据字段写入 sd 卡
ContextCompat.getExternalFilesDirs(context, null)说: Returns absolute paths to application-specific d
我正在为我的应用程序使用 Xamarin Android。一切正常,但在一个设备(三星平板电脑 - MeMo Pad 10 (ME302C) (ME302C))上,应用程序在我调用时崩溃:Appl
我正在构建一个 Android 应用程序,我选择在外部存储中使用 flat flies 作为我的持久化方法。我有一个使用一些静态实例方法扩展 Application 的类。调试几次后,我注意到没有一个
我正在尝试调试我在我的应用程序中遇到的问题。问题是 getExternalFiles(dir) 在我的 android 应用程序中返回 null 但我不确定为什么。我有必要的权限。这是一个存在于多个设
我是一名优秀的程序员,十分优秀!