Intent.migrateExtraStreamToClipData() 在空对象引用上
Intent.migrateExtraStreamToClipData() on a null object reference
开始在我的应用程序的生产版本中遇到此错误。
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference
没有明确说明这实际上发生在哪一行,但我最近将我的支持库版本更改为 24.0.0。这是完整的堆栈跟踪:
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.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)
编辑: 我还想指出,100% 收到此错误的用户也是 root 用户。这也发生在 23.4.0 上......我也有一个潜在的相关错误同时弹出,这与与 Firebase 相关的 Base64.decode 函数有关。
编辑 2: 前几天我从 Android 开发人员那里得到了一些帮助。他们建议我更新项目的 Google Play Services 版本,到目前为止似乎很有帮助。我会再等几天才能从我的用户那里得到结果,但最初的日志很有希望。
我之前使用的是 9.0.2,但我现在使用的是 9.2.0。
编辑 3: 更新到 9.2.0 并没有解决崩溃问题。我仍然从 root 用户那里得到同样的错误。我注意到在 Android 6.0 以下的用户发生崩溃,所以我将在实时设备上进行测试并尽快更新。
似乎错误发生在未安装 Google Play 服务的设备上,传递的 intent 将为空。
您可以通过重写 Activity.
中的 startActivityForResult 方法来确保传递的意图不为空
@Override
public void startActivityForResult(Intent intent, int requestCode) {
if (intent == null) {
intent = new Intent();
}
super.startActivityForResult(intent, requestCode);
}
确实有效
@Override
public void startActivityForResult(Intent intent, int requestCode) {
try {
super.startActivityForResult(intent, requestCode);
} catch (Exception ignored){}
}
这个问题有点老了,但我只是想分享一个更新。根据 this Github issue on the GCM project,该问题应在 Google Play 服务版本 9.4.0
中解决。接受的答案也应该有效(作为中间补丁),但如果您更新 Google Play Services 库,这个问题应该可以解决。
很可能与 中的问题相同。
不是真正的重复(因为 OP 无法追踪有问题的行,这在链接问题中是已知的),但如果有人遇到这个问题,链接问题的解决方案可能会有所帮助。
以下代码适用于 Android 11(API 30 级)或更高级别:
在AndroidManifest.xml,
<queries>
<package android:name="com.google.android.youtube" />
<package android:name="com.example.app" />
</queries>
“如果您的应用面向 Android 11(API 级别 30)或更高级别并且需要与自动可见的应用以外的应用进行交互,请在应用的清单文件中添加该元素. 在元素中,按包名称指定其他应用程序。"
参考here了解更多详情。
这确实对我有用。
对于 Android 11(API 30 级)或更高级别,AndroidManifest.xml,
<queries>
<package android:name="com.google.android.youtube" />
<package android:name="com.example.app" />
</queries>
“如果您的应用面向 Android 11(API 级别 30)或更高级别并且需要与自动可见的应用以外的应用进行交互,请在应用的清单文件中添加该元素. 在元素中,按包名称指定其他应用程序。"
参考here了解更多详情。
您可以直接使用getLaunchIntentForPackage
打开应用程序并设置您的应用程序包
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()
}
但是 Android 11(API 级别 30)出于安全原因它不会工作,要克服此解决方案,您需要在 AndroidManifes.xml
[=14= 中指定应用程序包]
<queries>
<package android:name="com.google.android.youtube" />
<package android:name="com.example.app" />
</queries>
在 Manifest 中添加此代码后已修复
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
开始在我的应用程序的生产版本中遇到此错误。
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference
没有明确说明这实际上发生在哪一行,但我最近将我的支持库版本更改为 24.0.0。这是完整的堆栈跟踪:
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.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)
编辑: 我还想指出,100% 收到此错误的用户也是 root 用户。这也发生在 23.4.0 上......我也有一个潜在的相关错误同时弹出,这与与 Firebase 相关的 Base64.decode 函数有关。
编辑 2: 前几天我从 Android 开发人员那里得到了一些帮助。他们建议我更新项目的 Google Play Services 版本,到目前为止似乎很有帮助。我会再等几天才能从我的用户那里得到结果,但最初的日志很有希望。
我之前使用的是 9.0.2,但我现在使用的是 9.2.0。
编辑 3: 更新到 9.2.0 并没有解决崩溃问题。我仍然从 root 用户那里得到同样的错误。我注意到在 Android 6.0 以下的用户发生崩溃,所以我将在实时设备上进行测试并尽快更新。
似乎错误发生在未安装 Google Play 服务的设备上,传递的 intent 将为空。
您可以通过重写 Activity.
中的 startActivityForResult 方法来确保传递的意图不为空@Override
public void startActivityForResult(Intent intent, int requestCode) {
if (intent == null) {
intent = new Intent();
}
super.startActivityForResult(intent, requestCode);
}
确实有效
@Override
public void startActivityForResult(Intent intent, int requestCode) {
try {
super.startActivityForResult(intent, requestCode);
} catch (Exception ignored){}
}
这个问题有点老了,但我只是想分享一个更新。根据 this Github issue on the GCM project,该问题应在 Google Play 服务版本 9.4.0
中解决。接受的答案也应该有效(作为中间补丁),但如果您更新 Google Play Services 库,这个问题应该可以解决。
很可能与
以下代码适用于 Android 11(API 30 级)或更高级别:
在AndroidManifest.xml,
<queries>
<package android:name="com.google.android.youtube" />
<package android:name="com.example.app" />
</queries>
“如果您的应用面向 Android 11(API 级别 30)或更高级别并且需要与自动可见的应用以外的应用进行交互,请在应用的清单文件中添加该元素. 在元素中,按包名称指定其他应用程序。"
参考here了解更多详情。
这确实对我有用。
对于 Android 11(API 30 级)或更高级别,AndroidManifest.xml,
<queries>
<package android:name="com.google.android.youtube" />
<package android:name="com.example.app" />
</queries>
“如果您的应用面向 Android 11(API 级别 30)或更高级别并且需要与自动可见的应用以外的应用进行交互,请在应用的清单文件中添加该元素. 在元素中,按包名称指定其他应用程序。"
参考here了解更多详情。
您可以直接使用getLaunchIntentForPackage
打开应用程序并设置您的应用程序包
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()
}
但是 Android 11(API 级别 30)出于安全原因它不会工作,要克服此解决方案,您需要在 AndroidManifes.xml
[=14= 中指定应用程序包]
<queries>
<package android:name="com.google.android.youtube" />
<package android:name="com.example.app" />
</queries>
在 Manifest 中添加此代码后已修复
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />