今天在测试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标志。
因为 Activity 与 Context 中都有一个 startActivity() 的方法,而 Activity 是 Context 的子类,在 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 !!!