Firebase Storage - StorageReference.getFile () failed while disconnecting a device

When I try to download a file from Firebase Storage using the StorageReference.getFile(File) method, it crashes when the device is disconnected and the timeout is reached. Logcat shows NPE in DynamicModulesC:

 java.lang.NullPointerException: null reference at asn.a(:com.google.android.gms.DynamiteModulesC:27) 

The same code works correctly and the file is downloaded when an Internet connection is available. I tested it on devices and emulators with Android 4.1 and 6.0. Firebase SDK version 9.6.1. Is this a bug in the Firebase SDK? Did I miss something?

The code is simple:

 FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(); //firebaseStorage.setMaxDownloadRetryTimeMillis(15 * 1000); StorageReference remoteDir= firebaseStorage.getReference().child("dir-with-files"); File destinationFile= new File("file-in-app-internal-storage"); StorageReference fileRef = remoteDir.child("file-from-firebase"); fileRef.getFile(destinationFile); 

Complete accident log:

 10-02 10:49:57.577 9429-9464/com.github.lecho.mobilization W/System: ClassLoader referenced unknown path: /system/priv-app/PrebuiltGmsCore/lib/x86_64 10-02 10:49:57.610 9429-9464/com.github.lecho.mobilization I/DynamiteModule: Considering local module com.google.android.gms.firebasestorage:0 and remote module com.google.android.gms.firebasestorage:1 10-02 10:49:57.610 9429-9464/com.github.lecho.mobilization I/DynamiteModule: Selected remote version of com.google.android.gms.firebasestorage, version >= 1 10-02 10:49:57.628 9429-9464/com.github.lecho.mobilization W/System: ClassLoader referenced unknown path: /data/user/0/com.google.android.gms/app_chimera/m/00000002/n/x86_64 10-02 10:50:11.599 9429-9462/com.github.lecho.mobilization W/ExponenentialBackoff: network unavailable, sleeping. 10-02 10:50:11.599 9429-9462/com.github.lecho.mobilization E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.firebase.FirebaseApiNotAvailableException: firebase-auth is not linked, please fall back to unauthenticated mode. 10-02 10:50:12.234 9429-9464/com.github.lecho.mobilization W/ExponenentialBackoff: network unavailable, sleeping. 10-02 10:50:12.234 9429-9464/com.github.lecho.mobilization E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.firebase.FirebaseApiNotAvailableException: firebase-auth is not linked, please fall back to unauthenticated mode. --------- beginning of crash 10-02 10:50:12.236 9429-9464/com.github.lecho.mobilization E/AndroidRuntime: FATAL EXCEPTION: FirebaseStorage-Download-3 Process: com.github.lecho.mobilization, PID: 9429 java.lang.NullPointerException: null reference at asn.a(:com.google.android.gms.DynamiteModulesC:27) at bul.d(:com.google.android.gms.DynamiteModulesC:261) at buf.onTransact(:com.google.android.gms.DynamiteModulesC:76) at android.os.Binder.transact(Binder.java:387) at com.google.android.gms.internal.zzans$zza$zza.aE(Unknown Source) at com.google.android.gms.internal.zzanv.aE(Unknown Source) at com.google.firebase.storage.FileDownloadTask.run(Unknown Source) at com.google.firebase.storage.StorageTask$5.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) 10-02 10:50:12.237 1540-1997/system_process W/ActivityManager: Force finishing activity com.github.lecho.mobilization/.ui.MainActivity [ 10-02 10:50:12.246 1540: 1997 D/ ] HostConnection::get() New Host Connection established 0x7f39f896fc00, tid 1997 
+7
android firebase firebase-database firebase-storage
source share
3 answers

It turns out that this is a bug in the Google Play services. The Firebase team has already fixed this. The fix is ​​available in version 9.8.77 of the Google Play services.

Now StorageReference.getFile(File) will not cause the application to crash when the device is disconnected. Instead, you will get the following answer:

 E/StorageException: StorageException has occurred. The operation retry limit has been exceeded. Code: -13030 HttpResult: -2 
+3
source share

Try the following:

 try{ fileRef.getFile(destinationFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { // Local temp file has been created } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } }); } catch (Exception e){ // Error } 

In addition, we can do the following: 1. Add a catch try block to handle any exceptions while the download file is being called. 2. Save the vault backup as a reference in onSaveInstanceState. 3. Later we can call onRestoreInstanceState.

 StorageReference mStorageRef; //mStorageRef was previously used to transfer data. @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // If there a download in progress, save the reference so you can query it later if (mStorageRef != null) { outState.putString("reference", mStorageRef.toString()); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // If there was a download in progress, get its reference and create a new StorageReference final String stringRef = savedInstanceState.getString("reference"); if (stringRef == null) { return; } mStorageRef = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef); // Find all DownloadTasks under this StorageReference (in this example, there should be one) List tasks = mStorageRef.getActiveDownloadTasks(); if (tasks.size() > 0) { // Get the task monitoring the download DownloadTask task = tasks.get(0); // Add new listeners to the task using an Activity scope task.addOnSuccessListener(this, new OnSuccessListener() { @Override public void onSuccess(DownloadTask.TaskSnapshot state) { handleSuccess(state); //call a user defined function to handle the event. } }); } } 
0
source share

You need to upload the file after you are online using the getFile () method and save the file locally. Then use the locally saved file after going offline. You cannot upload a file using the getFile () method when you are offline. Please read the documentation: https://firebase.google.com/docs/storage/android/download-files

-one
source share

All Articles