android - 如何在 Android Studio 中处理“java.io.FileNotFoundException: No content provider”错误
问题描述
我正在尝试将 pdf 文件从 firebase 存储打开到我的应用程序。这是我获取文件网址的代码。
StorageReference fileref=mStorage.getReferenceFromUrl(selectedItem.getFileUrl());
String fileref_string=fileref.toString();
Uri file_uri=Uri.parse(fileref_string);
但它显示了这个错误:
java.io.FileNotFoundException:没有内容提供者:gs://funn-30a97.appspot.com/uploads/1531599733740.pdf
如何处理?
上传文件的代码:mFileUri 是来自设备的文件的 url。
if (mFileUri != null) {
StorageReference fileReference = mStorageRef.child(System.currentTimeMillis() + "." + getFileExtension(mFileUri));
fileReference.putFile(mFileUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress(0);
}
}, 5000);
Toast.makeText(upload.this, "Upload Successful", Toast.LENGTH_LONG).show();
Uploading uploading = new Uploading(mEditTextFileName.getText().toString().trim(), taskSnapshot.getDownloadUrl().toString());
String uploadId = mDatabaseRef.push().getKey();
mDatabaseRef.child(uploadId).setValue(uploading);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(upload.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
mProgressBar.setProgress((int) progress);
}
});
上传类:
public class Uploading {
private String mname;
private String mfileUrl;
private String mKey;
public Uploading() {
}
public Uploading(String name, String fileUrl) {
if (name.trim().equals("")) {
name = "no name";
}
mname = name;
mfileUrl = fileUrl;
}
public String getName() {
return mname;
}
public void setName(String Name) {
mname = Name;
}
public String getFileUrl() {
return mfileUrl;
}
public void setfileUrl(String url) {
mfileUrl = url;
}
@Exclude
public String getKey() {
return mKey;
}
@Exclude
public void setKey(String key) {
mKey = key;
}
}
解决方案
这不是这样做的正确方法。你不应该调用toString()
你的StorageReference
对象。
尝试这个:
if (fileref.getPath().length() != 0) {
fileref.getDownloadUrl()
.addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Now you have the Uri of your file
}
});
}
祝你好运!
推荐阅读
- r - == 给出奇怪的结果 R
- sharepoint - 使用 CSOM 在 Sharepoint 2019 上查询项目权限
- angular - Angular 无法将结果转换为对象 - 是 IActionResult 吗?
- excel - 将命名范围值分配给变量(Excel VBA) - 新手
- c++ - 手动编译 GLFW “未选择支持的窗口创建 API”
- angular - 异步管道的Angular 9过滤结果
- dialog - 如何从一个子对话框重定向到另一个子对话框
- python - matplotlib 中的轴是什么
- flutter - 如何在 Flutter 上获取调用 Agora Video Call 的事件?
- sql - 获取以前的结清余额作为日期范围的未结余额