tyforcode
tyforcode

Reputation: 1767

Intent.migrateExtraStreamToClipData() on a null object reference

Started getting this error in the production version of my app.

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference

There's no clear line at which this actually occurs but I recently changed my support library version to 24.0.0. Here's the full stacktrace:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference
   at android.app.Instrumentation.execStartActivity(Instrumentation.java:1494)
   at android.app.Activity.startActivityForResult(Activity.java:3745)
   at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
   at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75)
   at android.app.Activity.startActivityForResult(Activity.java:3706)
   at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:871)
   at com.google.android.gms.common.internal.zzi$1.zztD(Unknown Source)
   at com.google.android.gms.common.internal.zzi.onClick(Unknown Source)
   at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5254)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

EDIT: I also want to note that 100% of the users getting this error are also rooted. This also occurs on 23.4.0... I also have a potential related error which popped up at the same time which has to do with the Base64.decode function in relation to Firebase.

EDIT 2: I received some help from an Android Dev the other day. They suggested that I update my project's Google Play Services version and it seems to have helped so far. I'll wait a few more days to get the results from my users but the initial logs are promising.

I was previously using 9.0.2 but I'm now on 9.2.0.

EDIT 3: Updating to 9.2.0 didn't help the crashes. I'm still getting the same error from rooted users. I've noted that at the users getting crashes are below Android 6.0 so I'll be testing on a live device and update ASAP.

Upvotes: 50

Views: 28878

Answers (8)

Tarif Chakder
Tarif Chakder

Reputation: 1856

You can open app directly using getLaunchIntentForPackage and set your app package

val intentApp = requireActivity().packageManager.getLaunchIntentForPackage("com.twitter.android")
        try {
            this.startActivity(intentApp)
        } catch (ex: ActivityNotFoundException) {
            Toast.makeText(this,getString(R.string.activity_no_app), Toast.LENGTH_LONG).show()
        }

But Android 11 (API level 30 ) for security reason it will no working , to over come this solution you need to specify app package in AndroidManifes.xml

<queries>
        <package android:name="com.google.android.youtube" />
        <package android:name="com.example.app" />
</queries>

Upvotes: 2

Murali M
Murali M

Reputation: 41

It got fixed after adding this code in Manifest

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />

Upvotes: 4

dmukherjee
dmukherjee

Reputation: 193

This actually worked for me.

For Android 11 (API level 30) or higher, in AndroidManifest.xml,

<queries>
        <package android:name="com.google.android.youtube" />
        <package android:name="com.example.app" />
</queries>

"If your app targets Android 11 (API level 30) or higher and needs to interact with apps other than the ones that are visible automatically, add the element in your app's manifest file. Within the element, specify the other apps by package name."

Refer here for more details.

Upvotes: 12

dmukherjee
dmukherjee

Reputation: 193

Following code worked for Android 11 (API level 30) or higher:

In AndroidManifest.xml,

<queries>
        <package android:name="com.google.android.youtube" />
        <package android:name="com.example.app" />
</queries>

"If your app targets Android 11 (API level 30) or higher and needs to interact with apps other than the ones that are visible automatically, add the element in your app's manifest file. Within the element, specify the other apps by package name."

Refer here for more details.

Upvotes: 1

Piotr Śmietana
Piotr Śmietana

Reputation: 463

Most probably it's the same problem as in getLaunchIntentForPackage is null for some apps. Not really a duplicate (since OP couldn't trace the offending line, which is known in linked question), but if someone faces this problem, linked question's solution might help.

Upvotes: 1

Smalls
Smalls

Reputation: 374

This question is a bit old, but I just wanted to share an update on it. According to this Github issue on the GCM project the issue should be solved in Google Play Services version 9.4.0. The accepted answer should work as well (as an intermediate patch), but if you update your Google Play Services library this issue should be solved.

Upvotes: 4

MVojtkovszky
MVojtkovszky

Reputation: 529

Seems like the error occurs on devices where Google Play Services are not installed, passed intent will then be null.

You can make sure intent passed is not null by overriding startActivityForResult method in your Activity.

@Override    
public void startActivityForResult(Intent intent, int requestCode) {
    if (intent == null) {    
        intent = new Intent();        
    }       
    super.startActivityForResult(intent, requestCode);
}

Upvotes: 20

user2212515
user2212515

Reputation: 1220

thats really works

@Override
public void startActivityForResult(Intent intent, int requestCode) {
    try {
        super.startActivityForResult(intent, requestCode);
    } catch (Exception ignored){}
}

Upvotes: 1

Related Questions