Google云端硬盘上的Storage Access Framework ACTION_CREATE_DOCUMENT有时导致0字节文件

时间:2019-02-25 08:29:51

标签: android google-drive-api storage-access-framework

突然之间,我的应用程序通过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云端硬盘应用有关,因为如果我清除其数据或缓存,则随后的上传可以正常工作,直到再次中断。

0 个答案:

没有答案