unity3d 每当我尝试在Android设备上上传文件时,都会出现“无内容提供商”错误

sg24os4d  于 2022-11-16  发布在  Android
关注(0)|答案(5)|浏览(126)

最近我在Android上上传文件时遇到了一个问题。在Unity编辑器上它运行得很好,但是每当我在Android上运行它时,我总是得到这个错误:

系统聚合异常:引发了类型为“系统.AggregateException”的异常。无内容提供者:/存储/模拟/0/安卓/数据/com. com.应用/文件/上传/ppp/master.json

下面是我用来上传文件到存储的代码:

Firebase.Storage.StorageReference f_ref = storage_ref.Child(referencePath); 
print("Reference path: " + referencePath); 

// Upload the file 
f_ref.PutFileAsync(filePath) 
.ContinueWith((Task<StorageMetadata> task) => 
{ 
  if (task.IsFaulted || task.IsCanceled) 
  { 
  Debug.Log(task.Exception.ToString()); 
  print("Couldn't upload " + filePath); 
  // Uh-oh, an error occurred! 
  } 
else { 
  Firebase.Storage.StorageMetadata metadata = task.Result; 
  string download_url = metadata.DownloadUrl.ToString(); 
  Debug.Log("download url = " + download_url); 
} 
});

文件存储在依赖于设备的永久文件路径中。我尝试有目的地上传不存在的文件路径,但收到了“FileNotFound”异常,因此我确定我尝试上传的文件的路径是正确的。
我将非常感谢任何帮助弄清楚这个异常意味着什么以及如何修复它。提前感谢!

apeeds0o

apeeds0o1#

请改用inputStreamputStream

InputStream is = new FileInputStream(filePath);
f_ref.putStream(is).....;
pieyvz9o

pieyvz9o2#

也许您应该传递一个格式为Like This的URI
文件:///sd卡/您的文件路径

oprakyz7

oprakyz73#

我也遇到了同样的问题,而E. Abdel的回答让我找到了正确的方向。我试图上传一个用BinaryFormatter保存的文件

BinaryFormatter bf = new BinaryFormatter();
    FileStream file = File.Create(Application.persistentDataPath + pathToFile);
    bf.Serialize(file, currentPlayer);
    file.Close();

我得到了完全相同的错误,然后我尝试了一种不同的上传方式。使用PutStreamAsync而不是PutFileAsync,我猜这需要用于BinaryFormatter的序列化文件。

// File located on disk
    string local_file = Application.persistentDataPath + pathToFile;

    // Create a reference to the file you want to upload
    StorageReference storage_ref = FirebaseStorage.DefaultInstance.RootReference;
    StorageReference player_ref = storage_ref.Child("test");

    Stream stream = new FileStream(local_file, FileMode.Open);
    player_ref.PutStreamAsync(stream).ContinueWith((Task<StorageMetadata> task) =>
    {
        if (task.IsFaulted || task.IsCanceled)
        {
            Debug.Log(task.Exception.ToString());
            // Uh-oh, an error occurred!
        }
        else
        {
            // Success
        }
    });
qnakjoqk

qnakjoqk4#

在我的例子中,我遇到了同样的错误(Firebase.Storage.StorageException:没有内容提供商)只能用Android上传文件。
阅读了E. Abdel的答案后,我发现了以下这些在C#中的Unity解决方案。

StreamReader stream = new StreamReader(file_path);

    StorageReference storage_ref = storageRef.Child(file_name_to_storage);

    storage_ref.PutStreamAsync(stream.BaseStream)
      .ContinueWith((Task<StorageMetadata> task) => {
          if (task.IsFaulted || task.IsCanceled)
          {
              Debug.Log(task.Exception.ToString());
          }
          else
          {
              Debug.Log("Finished uploading...");
          }
      });

它在Unity编辑器和Android中工作,上传指定文件路径的文件,在我的例子中file_path是:/storage/emulated/0/file_name.png

92dk7w1h

92dk7w1h5#

遇到了同样的问题。通过将“file://”放在URI前面并使用Uri.parse对其进行解析来解决此问题,解析为:

val uriString = Uri.parse("file://$uri")

       if (metadata != null) {
            fileRef.putFile(uriString, metadata).await()
        } else {
            fileRef.putFile(uriString).await()
        }

相关问题