Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No intent from UserRecoverableAuthIOException using Drive SDK for Android

I've implemented google drive into my android application and it work pretty nice, but I'm trying to figure out a way to run an upload/download in a background thread so that I can leave an activity and do something else on my app. The problem is, drive needs the activity reference in case of exceptions, such as UserRecoverableAuthIOException.

Here's the issue I cannot understand. Here's some try/catch code:

try {
    //...drive api stuff here
} catch (UserRecoverableAuthIOException e) {
    possibleException = e;
    try {
        e.getIntent();
    } catch ( NullPointerException e2 ) {  //this is the crazy part
        // e.getIntent() should not throw a nullpointer
        e2.printStackTrace();
        possibleException = e2;
    }
    onActivityRestartWhat = RESTART_IMPORT;
    // just a note i do handle this exception properly in another section of a code when there is an intent.
} catch (FileNotFoundException e) {
    possibleException = e;
    e.printStackTrace();
} catch (IOException e) {
    possibleException = e;
    e.printStackTrace();
}

What I can't figure out is why UserRecoverableAuthIOException is throwing a NullPointerException whey I try to access getIntent.

More Info

I do catch UserRecoverableAuthIOException when more authentication is needed and request it via the startActivityForResult method. Also, this exception is thrown only if I back out of the activity that has started, aka destroy the activity. Basically, I have a process that uploads/downloads drive files in a thread and if I don't leave the activity until completion it works, if I destroy the activity via the back button then I get this exception.

Stack Trace

07-10 14:45:32.903: W/System.err(1450): java.lang.NullPointerException
07-10 14:45:32.913: W/System.err(1450):     at android.content.Intent.<init>      (Intent.java:3529)
07-10 14:45:32.913: W/System.err(1450):     at    com.google.android.gms.auth.UserRecoverableAuthException.getIntent(Unknown Source)
07-10 14:45:32.913: W/System.err(1450):     at com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException.getIntent(UserRecoverableAuthIOException.java:62)
07-10 14:45:32.913: W/System.err(1450):     at my.app.DriveHelper$2.run(DriveHelper.java:211)

My Desire

I want to run downloads/uploads (via google drive) in a background thread. Since the sdk requires startActivityForResult and other methods that might require a reference to an Activity or Context that makes this difficult, but it should work once the app has been granted the sdk permissions that require those references. Hopefully this makes sense.

like image 687
Pzanno Avatar asked Oct 21 '22 06:10

Pzanno


1 Answers

Below are the steps you can follow to handle UserRecoverableAuthIOException Exception properly and you can even avoid getting that exception when back pressed.

In some cases if you are receiving that error mean the activity is destroyed so you shouldn't depend on the activity

  • You need to create fresh com.google.api.services.tasks.Tasks object from Context of Service not from any Activity directly like shown in 'tasks-android-sample'

When you get Exception

  1. You need show a notification with PendingIntent from Service

  2. PendingIntent should contain the reference to an Activity , say HomeActivity

  3. Activity should handle the intent extra and should do the required things like showing choose account dialog

you can go through the sample code here (GoogleTasksService)

like image 137
Balaji Avatar answered Oct 23 '22 22:10

Balaji