No intent from UserRecoverableAuthIOException usin

2020-06-21 01:38发布

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.

2条回答
唯我独甜
2楼-- · 2020-06-21 02:20

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)

查看更多
放我归山
3楼-- · 2020-06-21 02:30

What you can do, in this case don't use multiple activities.

By switching to views you can achieve your task.

查看更多
登录 后发表回答