0

我写了 2 个应用程序,A_app 和 B_app。
在 A_app 中,我想调用 B_app 并启动​​ B_app 的 CalledActivity。
但是 B_app 的 MAINActivity 是 MainActiity 而不是 CalledActivity。
在 A_app 中,我尝试使用以下代码调用 B_app:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.example.bapp","com.example.bapp.BActivity"));
intent.putExtra ("test2abc", "abctest2");
startActivity(intent);

而在 B_app 的 BActivity 中,onCreate 中的代码如下:

Bundle params = getIntent().getExtras();
if (params != null) {
    String temp = params.getString ("test2abc");
    Toast.makeText (BActivity.this, temp, Toast.LENGTH_LONG).show();
}

但是有一些错误如下:

01-10 10:47:16.904: E/AndroidRuntime(8355): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cmp=com.example.bapp/.BActivity (has extras) } from ProcessRecord{418a3788 8355:com.dlink.nas/u0a7} (pid=8355, uid=10007) not exported from uid 10115

我希望 B_app 仅由 A_app 直接调用,而无需其他调用。
我该如何解决?

4

1 回答 1

2

您需要将此添加到BActivity's<activity>节点下的“B_app”Android Manifest:

 android:exported="true"

所以它看起来像:

<activity android:name=".Bactivity" 
  android:label="@string/b_activity"
  android:exported="true">
<!--rest of activity node -->
</activity>

“导出”的另一种方法是设置一个意图过滤器(也在清单中):

<intent-filter>
    <action android:name="myFilter" />
    <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

由于 Android 默认情况下不允许访问所有活动,仅允许访问主要活动。

要回答您编辑的问题,有一种方法可以让应用程序在不导出的情况下调用彼此的组件,如this SO answer所示。您必须在清单中添加sharedUserLabel和属性。sharedUserId但是,他们指出不建议这样做,因为它可能会导致操作发生轻微变化。

于 2013-01-10T03:19:42.917 回答