错误记录一:两个应用间页面跳转时的权限错误

今天开发中遇到个问题,一个应用中启动另一个应用的页面时出现崩溃,跳转的代码如下:

private void startLearningActivity(String text){
        Intent intent = new Intent();
        String packageName="com.xxx.xxxx";
        String className="com.xxx.xxxx.XxxActivity";
        ComponentName name = new ComponentName(packageName, className);
        intent.setComponent(name);
        intent.putExtra("Text", text);  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
 }

错误log如下:

java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.xxx.xxxxcom.xxx.xxxx.XxxActivity(has extras) } from ProcessRecord{812ad43 4614:com.xxx.xxxxcom/u0a81} (pid=4614, uid=10081) not exported from uid 1000
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        ......

查找资料后发现目标Activity不支持其他应用调用。解决方法也很简单,给要跳转的目标Activity添加属性android:exported="true",该属性表示支持外部应用调用该页面。
AndroidManifest.xml中代码如下:

    <activity 
            android:name="com.xxx.xxxxcom.XxxActivity"
            android:exported="true">
    </activity>

如此问题就解决了。
还有一种办法,是在目标Activity的声明里添加一个action,代码如下:

 <activity 
     android:name="com.xxx.xxxxcom.XxxActivity">
     <intent-filter >
         <action android:name="android.intent.action.VIEW"/>
     </intent-filter>
 </activity>

同时启动方法里也添加上该action

private void startLearningActivity(String text){
        Intent intent = new Intent("android.intent.action.VIEW");
        String packageName="com.xxx.xxxx";
        String className="com.xxx.xxxx.XxxActivity";
        ComponentName name = new ComponentName(packageName, className);
        intent.setComponent(name);
        intent.putExtra("Text", text);  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
 }

如此也能解决问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容