今天在测试android 系统自带的分享功能时,android 7.0系统没问题,跑到我自己手机华为系统9.0上面直接,就报这个错了,如下打印报错:

I System.out: 准备开始分享
W System.err: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
W System.err: 	at android.app.ContextImpl.startActivity(ContextImpl.java:1040)
W System.err: 	at android.app.ContextImpl.startActivity(ContextImpl.java:1009)
W System.err: 	at android.content.ContextWrapper.startActivity(ContextWrapper.java:379)
W System.err: 	at com.utils.Utils.originalShareImage(Utils.java:312)
W System.err: 	at com.main.MainActivity.shareImageToApp(MainActivity.java:520)
W System.err: 	at org.qtproject.qt5.android.QtNative.startQtApplication(Native Method)
W System.err: 	at org.qtproject.qt5.android.QtNative$7.run(QtNative.java:374)
W System.err: 	at org.qtproject.qt5.android.QtThread$1.run(QtThread.java:61)
W System.err: 	at java.lang.Thread.run(Thread.java:784)

我的分享代码是:

  share_intent.setAction(Intent.ACTION_SEND_MULTIPLE);//设置分享行为
  share_intent.setType("image/*");//设置分享内容的类型 png
  share_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 share_intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
 System.out.println("准备开始分享");
       
 mcontext.startActivity(Intent.createChooser(share_intent, "Share"));

其中的mcontext 是我外部传入的,后面发现

通过外部Activity的上下文调用startActivity(),需要添加FLAG_ACTIVITY_NEW_TASK标志。

因为 ActivityContext 中都有一个 startActivity() 的方法,而 ActivityContext 的子类,在 Activity 中会重载 startActivity() 方法,所以两个方法存在区别。使用 Activity 中的方法没有任何的限制,但是如果使用的是 Context 中的方法,则需要添加一个标志 FLAG_ACTIVITY_NEW_TASK 来开启一个新的任务,否则就会遇到上述的问题。

根据网上的案例和分析,得到如下两种解决方案:

解决方法:

1、方法一:添加 FLAG_ACTIVITY_NEW_TASK

share_intent.setAction(Intent.ACTION_SEND_MULTIPLE);//设置分享行为
share_intent.setType("image/*");//设置分享内容的类型 png
share_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
share_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  //新增一个这个标记
share_intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
System.out.println("准备开始分享");
       
mcontext.startActivity(Intent.createChooser(share_intent, "Share"));

但是我发现新增
share_intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
这个标记后,还是一样报错,不得奇解,于是采用第二种方法,就解决了

2、方法二、在Activity中直接使用startActivity()方法

share_intent.setAction(Intent.ACTION_SEND_MULTIPLE);//设置分享行为
share_intent.setType("image/*");//设置分享内容的类型 png
share_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
share_intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
System.out.println("准备开始分享");
       
activity.startActivity(Intent.createChooser(share_intent, "Share"));

mcontext改为activity ,也就是外部传送过来的不是Context,而是 Activity,这样就完美解决了!

至于第一种为什么不行,可能也和操作系统有关系,现在版本太高了,本来7.0测试机系统不用加标记, 采用 Context 调用 也能跑过,没任何问题,还好多测试了几个!解决就行,不深究了!!! 有兴趣的可以自行研究。

OVER !!!