【MainActivity.kt】のshare()の部分でuploadFileメソッドの第一引数にfileNameという引数を渡しました。
class ~~~ var fileName = "" private fun share() { viewModel.uploadFile(fileName, repository = StorageRepository()) }
fileNameは別のActivityで以下のように作成してます
private fun makeSaveFile(): String { val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.JAPAN).format(Date()) val folder = this.activity?.getExternalFilesDir(null) val fileName = "sharephoto" + timeStamp val file = File(folder, fileName) return file.absolutePath }
uploadFileメソッドは【ViewModel.kt】で以下のように定義しています
class ViewModel : ViewModel() { fun uploadFile(fileName: String, repository: StorageRepository = StorageRepository()) { viewModelScope.launch { try { val firebasePath = "userId/url/voice.mp4" val stream = FileInputStream(File(fileName)) val result = async { repository.upload(stream, firebasePath) }.await() if (result.isSuccessful) { print("isSuccess is true") } else { print("isSuccess is false") } } catch (e: Exception) { } } } }
デバッガでfileNameの値を追ってみると、【MainActivity.kt】ではfileNameの値として作成したファイルの名前がはいっているのですが、uploadFile()の呼び出し先の【ViewModel.kt】に入るとfileNameの値が空になってしまいます。Logcatを見ると
java.lang.IllegalArgumentException: Cannot upload to getRoot
とあり、「IllegalArgumentException」について調べると、引数が不正な時に出ると書いてありました。おそらく、【ViewModel.kt】のuploadFile()で引数としてfileNameを置いた時の型が間違っているのかなと考えているのですが、StringのfileNameをStringで受取っているので、間違っているとも思えません。一体何がダメなのでしょうか。心が折れそうです。
y_waiwaiさんの回答欄へのコメントからの続きです:
よくよく質問文を読んでみますと、コルーチンは実は関係ない気がしてきました。
https://developer.android.com/kotlin/coroutines?hl=ja
を読むと、コルーチン内でメソッドの引数を使っても特に問題ないようにみえます。
> fileNameは別のActivityで以下のように作成してます
MainActivityではない別のActivityで作成している、と言うのが気になります。本当にshare()でのuploadFile呼び出し時に、正しいfileNameが渡っているでしょうか。
private fun share() {
// (1) ここでfileNameを確認
viewModel.uploadFile(fileName, repository = StorageRepository())
}
で、ViewModel.kt でも
class ViewModel : ViewModel() {
fun uploadFile(fileName: String, repository: StorageRepository = StorageRepository()) {
// (2) ここでfileNameを確認
viewModelScope.launch {
// (3) ここでもfileNameを確認
try {
val firebasePath = "userId/url/voice.mp4"
などと、少なくとも上記3か所で再度確認してみてください。
あと、ViewModelを継承しているサブクラスがまたViewModelと言う同じ名前なのはちょっと気になります。(本件とは関係ないでしょうけれど)
確認してみた結果ちゃんとfileNameが渡っておりました^-^;;
確認するタイミングが悪かったようです、ありがとうございました!
解決した、ということでしょうか。そうであれば説明と共に自己回答、自己解決で質問を閉じましょう。
回答1件
あなたの回答
tips
プレビュー