Ошибка аутентификации анонимного пользователя и загрузки файла json из Firebase Storage, Android Kotlin - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь загрузить файл, загруженный в хранилище Firebase.

Хотя у меня есть следующие правила:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

Я получаю сообщение об ошибке:

E / StorageUtil: ошибка при получении токена java .util.concurrent Исключение ):

private fun loadJson(context: Context,tagId: Int): String? {
        var input: InputStream? = null
        var jsonString: String

        jsonString=""
        mAuthListener = AuthStateListener { firebaseAuth ->
            val user = firebaseAuth.currentUser
            if (user != null) {
                // User is signed in
                Log.d(
                    "FirebaseAuth",
                    "onAuthStateChanged:signed_in:" + user.uid
                )
            } else {
                // User is signed out
                Log.d("FirebaseAuth", "onAuthStateChanged:signed_out")
            }
            // ...
        }
        mAuth = FirebaseAuth.getInstance();
        if (mAuth!!.getCurrentUser() != null)
        {
            mAuth!!.getCurrentUser()?.reload();
        }
        else {
            mAuth!!.signInAnonymously().addOnCompleteListener(this,
                OnCompleteListener<AuthResult> { task ->
                    if (task.isSuccessful) {
                        Log.d(TAG, "signInAnonymously:success")
                       //jsonString=actuallyLoad() **//Place 1**

                    } else {
                        Log.w(TAG, "signInAnonymously:failure", task.exception)
                    }
                })
        }
        //jsonString=actuallyLoad() **//Place 2**
        return jsonString
    }

Здесь я делаю запрос на файл json:

private fun actuallyLoad(): String {
        var input: InputStream? = null
        var jsonString: String=""
        try {
            var islandRef = storageReference?.child("productInfo/testFile.json")
            val localFile = File.createTempFile("productInfo", "json")
            val task: FileDownloadTask = islandRef!!.getFile(localFile)
            try {
                if (task.isSuccessful()) {
                    Toast.makeText(
                        this,
                        "File downloaded successfully.",
                        Toast.LENGTH_SHORT
                    ).show()
                    try {
                        val reader =
                            BufferedReader(InputStreamReader(FileInputStream(localFile)))
                        val result = StringBuilder()
                        val line: String? = null
                        while (line + java.lang.String.valueOf(reader.read()) != null) {
                            Log.e("Test", "Result - $result")
                            result.append(line)
                        }
                        jsonString.plus(result.toString())
                    } catch (e: FileNotFoundException) {
                        e.printStackTrace()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }
                } else {
                    Log.e("Test", "Failed: " + task.exception)
                    Toast.makeText(this, "File downloading failed", Toast.LENGTH_LONG)
                        .show()
                }
            } catch (e: ExecutionException) {

                e.printStackTrace()
            } catch (e: InterruptedException) {
                e.printStackTrace()
            }
            println(jsonString)
            return jsonString

        } catch (ex: Exception) {
            ex.printStackTrace()
        } finally {
            input?.close()
        }
        return "Fail"
    }

Итак, без аутентификационной части

val task: FileDownloadTask = islandRef!!.getFile(localFile)

выдает ошибку что мне нужно сначала войти в систему (хотя в другом упражнении я могу получать изображения без необходимости).

При аутентификации, если я помещаю вызов actuallyLoad() в Место 1, то actuallyLoad() не вызывается (как и другой код, который находится внутри mAuth!!.signInAnonymously().addOnCompleteListener). Но я не получаю ошибку «Пожалуйста, войдите в систему». И анонимная учетная запись не создается в Firebase.

При аутентификации, если я помещаю вызов actuallyLoad() в Place 2, тогда

val task: FileDownloadTask = islandRef!!.getFile(localFile)

выдает нужную мне ошибку войти сначала. И анонимная учетная запись создается в Firebase.

Решение было бы поместить actuallyLoad() в mAuth!!.signInAnonymously().addOnCompleteListener, но я не знаю, почему какой-либо код здесь не вызывается или не выполняется.

Само собой разумеется, что загрузка файла не будет работать, если не будет вызван actuallyLoad() или если я получу ошибку входа в систему.

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...