私はちょうどアプリケーション間通信の特定のシナリオで遊んでいて、Android ではアプリケーションのメイン アクティビティをカスタム アクセス許可で保護できないという問題を回避しようとしています (その場合は起動できません)。まったく)。
I tried to use two activities instead: 1) The main activity which is not protected.
2) When a button is clicked, the main activity sends an explicit Intent to start the second activity.
That one performs some sensitive work and is protected by a custom permission
("toy.test.permission.ACTIVATE_SECOND_ACTIVITY").
The idea being that if the main activity is either started by the user from the launcher or
by a foreign maliscious application using an explicit intent, we can warn the user before he pushes the button to proceed.
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
final Button start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent activateIntent = new Intent(MainActivity.this,
SecondActivity.class);
startActivity(activateIntent);
finish();
}
}); ....
The Manifest.xml file looks like that:
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/second_activity_name"
android:theme="@style/AppTheme"
android:permission="toy.test.permission.ACTIVATE_SECOND_ACTIVITY" >
<intent-filter>
<action android:name="toy.test.action.ACTIVATE_SECOND_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
(In addition, the SecondActivity can be started from a friend application by an implicit Intent with actionString="toy.test.action.ACTIVATE_SECOND_ACTIVITY" using the permission "toy.test.permission.ACTIVATE_SECOND_ACTIVITY".)
Android 2.3.3 と Android 4.2 の違い:
Android 4.2 デバイスまたはエミュレーターでは、アプリケーションが「toy.test.permission.ACTIVATE_SECOND_ACTIVITY」のアクセス許可を明示的に要求することはありませんが、問題なく [開始] ボタンをクリックして MainActivity から SecondActivity を開始できます。
ただし、Android 2.3.3 エミュレーターでは、SecurityException が原因で SecondActivity を開始できません。
FATAL EXCEPTION: main
java.lang.SecurityException: Permission Denial: starting Intent { cmp=toy.test/.SecondActivity }
from ProcessRecord{406827d0 405:toy.test/10034} (pid=405, uid=10034) requires
toy.test.permission.ACTIVATE_SECOND_ACTIVITY
混乱しています: 2 つの Android バージョン間で権限の適用が変更されましたか? そして、Android 4.2がそのような状況、つまり許可なくSecondActivityをアクティブ化することを許可するのは意図的ですか? (もちろん、それは役に立ちます。)
puffin137、ご回答ありがとうございます。