【问题标题】:Intent.migrateExtraStreamToClipData() on a null object reference空对象引用上的 Intent.migrateExtraStreamToClipData()
【发布时间】:2016-10-28 17:11:21
【问题描述】:

在我的应用的生产版本中开始出现此错误。

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$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)

编辑:我还想指出,收到此错误的 100% 的用户也是 root 用户。这也发生在 23.4.0... 我也有一个潜在的相关错误同时弹出,这与与 Firebase 相关的 Base64.decode 函数有关。

编辑 2: 前几天我从一位 Android 开发人员那里得到了一些帮助。他们建议我更新我的项目的 Google Play 服务版本,到目前为止似乎有所帮助。我会再等几天才能从我的用户那里得到结果,但最初的日志很有希望。

我之前使用的是 9.0.2,但我现在使用的是 9.2.0。

编辑 3: 更新到 9.2.0 对崩溃没有帮助。我仍然从根用户那里得到同样的错误。我注意到崩溃的用户低于 Android 6.0,因此我将在实时设备上进行测试并尽快更新。

【问题讨论】:

  • 这也发生在我的模拟器上。首先,我收到一个弹出窗口:... 依赖于您的设备不支持的 Google Play 服务。联系制造商寻求帮助。我会尝试调试。
  • @Wirling 既然你提到了它,我有点怀疑错误报告来自谷歌的云测试实验室设备,而不是我用户的设备。我最近刚刚专门为我的设备植根以测试此错误,但我还没有看到它弹出。
  • 我可以使用 Google Play Services Vision 库 (9.2) 重现这一点。在启动相机进行二维码检测之前,我使用isGooglePlayServicesAvailable 方法进行了简单检查。如果它不可用,我将显示来自getErrorDialog 方法的对话框。然后它会在尝试更新时崩溃。仅在有根设备上发生。
  • 我在尝试打开 Playstore 时也面临同样的问题 - 这是代码 - Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=com.whatsapp"));开始活动(意图);
  • 嗨@c0d3blooded。我已经看过这个问题:github.com/google/gcm/issues/209,他们说这个错误已修复。你(或任何人)可以检查吗?我无法重现该错误。谢谢!

标签: android android-intent android-support-library


【解决方案1】:

似乎错误发生在未安装 Google Play 服务的设备上,传递的意图将是空的。

您可以通过覆盖 Activity 中的 startActivityForResult 方法来确保传递的意图不为空。

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

【讨论】:

  • @jlivelyare 你也可以在 try catch 块中调用 super 。这样一来,空指针异常就会毫无疑问地被捕获。唯一需要确定的是覆盖 startActivityForResult 的活动是正确的。
  • 对不起,空虚的开始活动到底有什么意义?
  • @JanHudec 这个答案的重点是避免处理传递的空意图,这实际上可能超出您的控制范围,并会导致崩溃(因此问题)。
【解决方案2】:

这个问题有点老了,但我只是想分享一个更新。根据this Github issue on the GCM project,该问题应在 Google Play 服务版本9.4.0 中解决。接受的答案应该也可以工作(作为中间补丁),但是如果您更新您的 Google Play 服务库,这个问题应该会得到解决。

【讨论】:

    【解决方案3】:

    这实际上对我有用。

    对于 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

    【讨论】:

      【解决方案4】:

      您可以直接使用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 中指定应用程序包

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

      【讨论】:

        【解决方案5】:

        很可能与getLaunchIntentForPackage is null for some apps 中的问题相同。 不是真正的重复(因为 OP 无法追踪链接问题中已知的违规行),但如果有人遇到此问题,链接问题的解决方案可能会有所帮助。

        【讨论】:

        • 我遇到了这个确切的问题。必须有办法解决它。其他 3rd 方应用程序正在成功打开我无法打开的活动
        【解决方案6】:

        以下代码适用于 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

        【讨论】:

          【解决方案7】:

          确实有效

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

          【讨论】:

          • 尝试 catch 块很慢。对于这种情况,空检查就足够了。
          【解决方案8】:

          在 Manifest 中添加此代码后已修复

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

          【讨论】:

            猜你喜欢
            • 2018-06-27
            • 2017-12-28
            • 2016-06-04
            • 2021-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多