首页 > 解决方案 > 如何读/写非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 卡插槽。

标签: javaandroidfilestorage-access-frameworkgoogle-pixel

解决方案


在我发现访问外部存储的可能性在不同的 android 版本中存在很大差异后,我选择使用存储访问框架 (SAF)。SAF 是一个 API(从 API 级别 19 开始),它为用户提供一个 UI 来浏览文件。

使用 Intent,会弹出一个 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();
    }
}

推荐阅读