如何 read/write 到非 root 用户可以访问的文件?
How to read/write to a file that can be accessed by a user not being 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 卡插槽。
在我发现不同 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();
}
}
我想写入一个我可以从文件系统访问的文件,而无需成为 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 卡插槽。
在我发现不同 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();
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();
}
}