突然之间,我的应用程序通过Storage Access Framework功能的Google云端硬盘备份/恢复无法正常工作。用户报告它有时会失败,有时会失败,没有明确的原因。内部或外部存储选项将按预期工作。
这是我的代码:
private void createDocument(String fileName) {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/json");
intent.putExtra(Intent.EXTRA_TITLE, fileName);
try {
startActivityForResult(intent, REQUEST_CREATE_DOCUMENT);
}
catch (ActivityNotFoundException ex) {
Toast.makeText(this, R.string.message_saf_not_supported, Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && data != null) {
Uri uri = data.getData();
if (requestCode == REQUEST_CREATE_DOCUMENT && uri != null) {
ParcelFileDescriptor fileDescriptor = getApplicationContext().getContentResolver().openFileDescriptor(Uri.parse(uriString), "w");
if (fileDescriptor != null) {
FileOutputStream fileOutputStream = new FileOutputStream(fileDescriptor.getFileDescriptor());
// Write bytes...
fileOutputStream.close();
fileDescriptor.close();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
我调试了代码,并遇到了这种奇怪的行为。 如果要写入的数据很少,并且代码几乎立即执行,那么它在大多数情况下都会起作用。 如果数据很大(通常约为10MB),或者我在onActivityResult方法上设置了一个断点,则openFileDescriptor或FileOutputStream创建会抛出FileNotFoundException,或者即使未引发该异常也会以静默方式失败,并且Google云端硬盘上的文件长度为0个字节。
我什至尝试将ParcelFileDescriptor / FileOutputStream部分放置在后台线程AsyncTask,Worker中,但没有任何运气。问题是一样的。
这让我的用户不满,并使我的评分下降了很多。我确定在过去的两个月中我的代码中没有任何内容,所以问题一定存在于其他地方,但是我不知道...
编辑:我可能要补充一点,这似乎与Google云端硬盘应用有关,因为如果我清除其数据或缓存,则随后的上传可以正常工作,直到再次中断。