Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android代码中读写用户可访问的目录?_Java_Android_File_Io_Filesystems - Fatal编程技术网

Java 如何在android代码中读写用户可访问的目录?

Java 如何在android代码中读写用户可访问的目录?,java,android,file,io,filesystems,Java,Android,File,Io,Filesystems,我是应用程序开发新手,希望从用户可访问的目录(如Android上的文档)读取和写入文件。我在网上找到的所有东西都不起作用或写入隐藏文件 我想能够读取基本的文本文件和图片从一个目录和子目录进行处理。我需要从与DCIM、Download、Music等目录相同的内部存储器中读取数据 我需要一份如何做的详细资料。我正在Android Studio上为Android 6和更高版本编写代码。我只能访问dev手机上的内部存储 提前谢谢。对不起,我是个笨蛋 我真的不知道什么适用于背景。我不完全理解Android

我是应用程序开发新手,希望从用户可访问的目录(如Android上的文档)读取和写入文件。我在网上找到的所有东西都不起作用或写入隐藏文件

我想能够读取基本的文本文件和图片从一个目录和子目录进行处理。我需要从与DCIM、Download、Music等目录相同的内部存储器中读取数据

我需要一份如何做的详细资料。我正在Android Studio上为Android 6和更高版本编写代码。我只能访问dev手机上的内部存储

提前谢谢。对不起,我是个笨蛋

我真的不知道什么适用于背景。我不完全理解Android文件系统和权限是如何工作的

我的dev手机是一款搭载android 10的Google Pixel 3a

这是我的项目代码: 舱单:

主要活动:

包装nbradham.rwtest; 导入android.Manifest; 导入android.app.Activity; 导入android.content.pm.PackageManager; 导入android.os.Bundle; 导入android.os.Environment; 导入androidx.annotation.NonNull; 导入java.io.BufferedReader; 导入java.io.File; 导入java.io.FileReader; 导入java.io.IOException; 公共类MainActivity扩展了活动{ 私有最终整数存储\权限\请求\代码=0; @凌驾 受保护的void onCreateBundle savedInstanceState{ super.onCreatesavedInstanceState; System.out.println; RequestPermissions新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE},STORAGE_permission_REQUEST_CODE; } @凌驾 public void onRequestPermissionsResultint requestCode,@NonNull字符串[] 权限,@NonNull int[]grantResults{ super.onRequestPermissionsResultrequestCode、权限、grantResults; 系统输出打印输出。。。; 开关请求代码{ 案例存储\权限\请求\代码: 如果授予grantResults[0]==PackageManager.PERMISSION\u{ 系统输出打印读取。。。; 试一试{ 文件f=new FileEnvironment.getExternalStorageDirectory,下载/loadme.txt; System.out.printlnf.getAbsolutePath; BufferedReader br=新的BufferedReadernew文件读取器; }捕捉异常{ e、 打印跟踪; } } 打破 违约: 打破 } } } 以下是输出:


10/02 18:34:50: Launching 'app' on Google Pixel 3a.
$ adb shell am start -n "nbradham.rwtest/nbradham.rwtest.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Waiting for process to come online...
Connected to process 5611 on device 'google-pixel_3a-93KAY0C208'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/nbradham.rwtes: Late-enabling -Xcheck:jni
E/nbradham.rwtes: Unknown bits set in runtime_flags: 0x8000
I/System.out: ############
I/Adreno: QUALCOMM build                   : 4a00b69, I4e7e888065
    Build Date                       : 04/09/19
    OpenGL ES Shader Compiler Version: EV031.26.06.00
    Local Branch                     : 
    Remote Branch                    : 
    Remote Branch                    : 
    Reconstruct Branch               : 
    Build Config                     : S P 8.0.6 AArch64
I/Adreno: PFP: 0x016ee183, ME: 0x00000000
W/Gralloc3: mapper 3.x is not supported
I/System.out: Perm...
    Reading...
I/System.out: /storage/emulated/0/Download/loadme.txt
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/loadme.txt: open failed: EACCES (Permission denied)
        at libcore.io.IoBridge.open(IoBridge.java:496)
        at java.io.FileInputStream.<init>(FileInputStream.java:159)
        at java.io.FileReader.<init>(FileReader.java:72)
        at nbradham.rwtest.MainActivity.onRequestPermissionsResult(MainActivity.java:39)
W/System.err:     at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8264)
        at android.app.Activity.dispatchActivityResult(Activity.java:8114)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4838)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
    Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
        at libcore.io.Linux.open(Native Method)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
        at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7255)
        at libcore.io.IoBridge.open(IoBridge.java:482)
        ... 17 more

您必须在Manifiest中将权限放在第一位:

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后,您必须捕获onActvitiyResult重写方法的权限

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[]
            permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case STORAGE_PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults.length > 0 && permissions[1].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {
                    // check whether storage permission granted or not.
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                       // do you stuff if your permission is granted
                    }
                }
                break;
            default:
                break;
        }
    }

我想我成功地获得了像SD卡一样写入外部目录的权限,但我的设备没有外部存储。我需要能够从内部用户数据DCIM、下载、图片等旁边的目录中读取数据,因此您无法使用getexternalStorage获取内部存储目录?这确实返回了正确的路径,但我仍然无法从中写入和读取数据。在安卓10中,他们似乎极大地改变了存储权限的工作方式。只需请求权限的旧方法只适用于特定于应用程序的目录。它不允许您写入主公共存储。
 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[]
            permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case STORAGE_PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults.length > 0 && permissions[1].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {
                    // check whether storage permission granted or not.
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                       // do you stuff if your permission is granted
                    }
                }
                break;
            default:
                break;
        }
    }