Android Firebase令牌身份验证错误

Android Firebase令牌身份验证错误,android,firebase,firebase-realtime-database,firebase-storage,Android,Firebase,Firebase Realtime Database,Firebase Storage,我正在使用firebase存储上载文件,但当我上载文件时,会出现此错误 E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzand: Please sign in before trying to get a token. 我用谷歌搜索了一下,但找不到答案! 我已在firebase中登录。我想您在上传文件之前没有登录。在启动器活

我正在使用firebase存储上载文件,但当我上载文件时,会出现此错误

E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzand: Please sign in before trying to get a token.
我用谷歌搜索了一下,但找不到答案!
我已在firebase中登录。

我想您在上传文件之前没有登录。在启动器活动的onCreate()中,尝试以下代码

FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
然后在onStart()中

意为

private void signinanoymously(){
mAuth.signinanoymously().addOnSuccessListener(这是新的OnSuccessListener()){
@凌驾
成功时公共无效(AuthResult AuthResult){
//做你的事
}
})
.addOnFailureListener(此,新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
Log.e(标记“signinanoymously:FAILURE”,异常);
}
});
}

这可能会解决您的问题

以下步骤对我有效:

  • 使用包ID从firebase生成正确的google-services.json

  • 内置.gradle(应用程序)

  • 确保在build.gradle(项目根文件夹)中添加以下依赖项

  • 在“活动”中下载文件时,添加以下代码:

    // Declaration reference
    private StorageReference storageRef;
    
    
    private void downloadImageFromFireBase()
    {
    showProgressDialog("Downloading image..");
    
    storageRef = storage.getReferenceFromUrl("gs://XXX.appspot.com/").child("av"+ datePassed +".jpg");
    showImageFromFireBaseDataBase();
    }
    
    private void showImageFromFireBaseDataBase()
    {
        try {
            final File localFile = File.createTempFile("images", "jpg");
            final Bitmap[] bitmap = new Bitmap[1];
                storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                        Log.e("Test", "success!");
                        bitmap[0] = BitmapFactory.decodeFile(localFile.getAbsolutePath());
                        raysImage.setImageBitmap(bitmap[0]);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        Log.e("Test", "fail :( " + exception.getMessage());
                    }
                });
            }catch(IOException e){
            Log.e("ImageView",e.toString());
            }
        }
    
    //声明引用
    私有存储引用storageRef;
    private void从Firebase()下载图像
    {
    showProgressDialog(“下载图像…”);
    storageRef=storage.getReferenceFromUrl(“gs://XXX.appspot.com/”).child(“av”+datePassed+”.jpg”);
    showImageFromFireBaseDataBase();
    }
    私有void showImageFromFireBaseDataBase()
    {
    试一试{
    最终文件localFile=File.createTempFile(“图像”、“jpg”);
    最终位图[]位图=新位图[1];
    storageRef.getFile(localFile).addOnSuccessListener(新的OnSuccessListener(){
    @凌驾
    成功时公共无效(FileDownloadTask.TaskSnapshot TaskSnapshot){
    Log.e(“测试”,“成功!”);
    位图[0]=位图工厂.decodeFile(localFile.getAbsolutePath());
    setImageBitmap(位图[0]);
    }
    }).addOnFailureListener(新的OnFailureListener(){
    @凌驾
    public void onFailure(@NonNull异常){
    Log.e(“Test”,“fail:(“+exception.getMessage()));
    }
    });
    }捕获(IOE异常){
    Log.e(“ImageView”,e.toString());
    }
    }
    

  • 我也遇到了同样的问题,这是因为默认情况下firebase只允许上传来自用户的、经过身份验证的文件

    在storage util异常上方,可能存在类似以下内容的日志:

    E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzajb: Please sign in before trying to get a token.
    
    我们有自己的身份验证过程,没有使用firebase,所以我们决定在firebase控制台中更改存储规则

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

    注意:更改规则将允许任何用户将文件上载到您的firebase云服务器。

    这可以是像internet连接这样简单的事情,也就是说,如果您的所有代码都正确,并且您已对firebase上的所有用户进行了身份验证。

    也许您无法“开始”我的意思是,因为我创建了一个项目,所以可以通过Android Studio IDE连接到firebase存储,但我必须在控制台上手动“启动”。

    您必须首先登录FirebaseAuth

    你可以匿名登录

    但如果你想登录用户的谷歌id,可以这样尝试

    为了便于使用,我创建了一个manager类。


  • 让(你的)GoogleUserManager类

  • 在片段(或活动)中使用manager


  • 你能发布一些额外的代码,让我们看看你实际上在做什么,然后理想地重新编写它吗?请参阅了解更多信息:)总是在失败时出现:-(你需要通过Firebase控制台中的“身份验证->登录方法”启用匿名登录,你的应用程序才能这样做。没错,你需要启用“匿名”作为项目中的“登录方法”。您不需要实现。signinanoymously(),只要您的存储规则允许未经身份验证的写入,它就可以在没有它的情况下工作。我被相同的错误消息弄糊涂了,但我相信它只会在您被拒绝的情况下发生…在执行此操作之前,请确保您的Gradle(模块)中有此依赖项:implementation'com.google.firebase:firebase-storage:10.2.0'implementation'com.google.firebase:firebase-auth:10.2.0'implementation'com.google.firebase:firebase-core:10.2.0'implementation'com.firebase:firebase-client-android:2.4.0'及之后,启用正确的登录验证ider在Firebase控制台(sing in tab)这里提供的答案在Recycle view adapter中帮助了我,谢谢。即使有这些设置,我也收到了这个异常消息,尽管我很乐意上传和下载文件
    dependencies {
    
    classpath 'com.android.tools.build:gradle:2.2.3'
    classpath 'com.google.gms:google-services:3.0.0'
    
    }
    
    // Declaration reference
    private StorageReference storageRef;
    
    
    private void downloadImageFromFireBase()
    {
    showProgressDialog("Downloading image..");
    
    storageRef = storage.getReferenceFromUrl("gs://XXX.appspot.com/").child("av"+ datePassed +".jpg");
    showImageFromFireBaseDataBase();
    }
    
    private void showImageFromFireBaseDataBase()
    {
        try {
            final File localFile = File.createTempFile("images", "jpg");
            final Bitmap[] bitmap = new Bitmap[1];
                storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                        Log.e("Test", "success!");
                        bitmap[0] = BitmapFactory.decodeFile(localFile.getAbsolutePath());
                        raysImage.setImageBitmap(bitmap[0]);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        Log.e("Test", "fail :( " + exception.getMessage());
                    }
                });
            }catch(IOException e){
            Log.e("ImageView",e.toString());
            }
        }
    
    E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzajb: Please sign in before trying to get a token.
    
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
        allow read, write;
        }
      }
    }
    
    object YourGoogleUserManager {
    
        private lateinit var gso: GoogleSignInOptions
        private lateinit var firebaseAuth: FirebaseAuth
    
        fun init(context: Context) {
            firebaseAuth = FirebaseAuth.getInstance()
            gso = GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(context.getString(R.string.default_web_client_id))
                .build()
        }
    
        fun startGoogleSignInForResult(
            fragment: Fragment,
            onSuccess: (AuthResult) -> Unit,
            onFail: (Exception) -> Unit
        ): ActivityResultLauncher<Intent> {
            return fragment.registerForActivityResult(
                ActivityResultContracts.StartActivityForResult()
            ) {
                val task = GoogleSignIn.getSignedInAccountFromIntent(it.data)
                handleGoogleSignInResult(task, onSuccess, onFail)
            }
        }
    
        fun signIn(
            activityResultLauncher: ActivityResultLauncher<Intent>,
            activity: Activity
        ) {
    
            val googleSignInClient = GoogleSignIn.getClient(activity, gso)
    
            activityResultLauncher.launch(googleSignInClient.signInIntent)
        }
    
        private fun handleGoogleSignInResult(
            task: Task<GoogleSignInAccount>,
            onSuccess: (AuthResult) -> Unit,
            onFail: (Exception) -> Unit
        ) {
            try {
                val account = task.getResult(ApiException::class.java)
                val credential = GoogleAuthProvider.getCredential(account?.idToken, null)
                firebaseAuth.signInWithCredential(credential)
                    .addOnSuccessListener {
                        CatHolicLogger.log("success to firebase google sign in")
                        onSuccess(it)
                    }
                    .addOnFailureListener {
                        CatHolicLogger.log("fail to firebase google sign in")
                        onFail(it)
                    }
            } catch (e: ApiException) {
                CatHolicLogger.log("fail to firebase google sign in")
                onFail(e)
            }
        }
    
        fun signOut() {
            firebaseAuth.signOut()
        }
    }
    
    class YourApplication : Application() {
    
        ...
    
        override fun onCreate() {
            super.onCreate()
    
            initGoogleUserManager()
        }
    
        ...
    
        private fun initGoogleUserManager() {
            YourGoogleUserManager.init(this)
        }
    }
    
    class YourFragment : Fragment() {
    
        ...
        ...
    
        private val startGoogleSignInForResult =
            YourGoogleUserManager.startGoogleSignInForResult(this, onSuccess = {
                // your job after success to sign in
            }, onFail = {
                // your job after fail to sign in
            })
    
        ...
        ...
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            binding.signInButton.setOnClickListener {
                YourGoogleUserManager.signIn(startGoogleSignInForResult, requireActivity())
            }
        }
    }