开发者社区> 问答> 正文

如何读取/写入可以由非root用户访问的文件?

我想写一个文件,我可以从该文件系统访问而无需root用户。

这是我的尝试:


FileOutputStream fos = null;
final String FILE_NAME = "test.txt";

fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
fos.write("test".getBytes());

// Display path of file written to
Toast.makeText(this, "Saved to" + getFilesDir() + "/" + FILE_NAME, Toast.LENGTH_LONG).show();

哪个写

/data/user/0/com.example.PROJECT_NAME/files/test.txt

如果没有root用户,则无法访问。

如果可以指定我知道可以访问的其他绝对路径,那将是很好的选择/data/data/...。

我的设备是Google Pixel C,很遗憾,它没有外部SD卡插槽可写入。

问题来源:Stack Overflow

展开
收起
montos 2020-03-26 21:14:05 490 0
1 条回答
写回答
取消 提交回答
  • 在我发现在不同的android版本中访问外部存储的可能性有很大不同之后,我选择了Storage Access Framework(SAF)。SAF是一种API(自API级别19起),向用户提供一个UI来浏览文件。

    使用Intent,会弹出一个UI,该UI允许用户创建文件或选择现有文件:

    private static final int CREATE_REQUEST_CODE = 40;
    private Uri mFileLocation = null;
    
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("text/plain"); // specify file type
    intent.putExtra(Intent.EXTRA_TITLE, "newfile.txt"); // default name for file
    
    startActivityForResult(intent, CREATE_REQUEST_CODE);
    

    用户选择后,onActivityResult(...)将调用一个文件。现在可以通过调用resultData.getData();来获取文件的URI。

    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    
        if (resultCode == Activity.RESULT_OK)
        {
            if (requestCode == CREATE_REQUEST_CODE)
            {
                if (resultData != null) {
                    mFileLocation = resultData.getData();
                }
            } 
        }
    }
    

    现在使用此URI写入文件:

    private void writeFileContent(Uri uri, String contentToWrite)
    {
        try
        {
            ParcelFileDescriptor pfd = this.getContentResolver().openFileDescriptor(uri, "w"); // or 'wa' to append
    
            FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
            fileOutputStream.write(contentToWrite.getBytes());
    
            fileOutputStream.close();
            pfd.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    回答来源:Stack Overflow

    2020-03-26 21:15:37
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载