2

我只是在玩某种应用程序间通信的场景,并试图规避在 Android 中应用程序的主要活动无法通过自定义权限来保护的问题(因为在这种情况下它无法启动完全)。

我尝试改用两个活动:1)不受保护的主要活动。2)当一个按钮被点击时,主活动发送一个明确的意图来启动第二个活动。那个执行一些敏感的工作并受到自定义权限(“toy.test.permission.ACTIVATE_SECOND_ACTIVITY”)的保护。
这个想法是,如果主要活动是由用户从启动器启动的,或者是由使用显式意图的外部恶意应用程序启动的,我们可以在用户按下按钮继续之前警告用户。

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();
        }
    });  ....

Manifest.xml 文件如下所示:

<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>

(此外,SecondActivity 可以通过一个隐含的 Intent 使用 actionString="toy.test.action.ACTIVATE_SECOND_ACTIVITY" 使用权限“toy.test.permission.ACTIVATE_SECOND_ACTIVITY”从朋友应用程序启动。)

现在android 2.3.3和android 4.2的区别:

在 android 4.2 设备或模拟器上,SecondActivity 可以通过单击 Start 按钮从 MainActivity 启动而没有任何问题,尽管应用程序没有明确要求“toy.test.permission.ACTIVATE_SECOND_ACTIVITY”权限。

但是,在 android 2.3.3 模拟器上,SecondActivity 无法启动,因为 SecurityException:

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 

我很困惑:两个 Android 版本之间的权限执行是否发生了变化?android 4.2是否故意允许这种情况,即未经许可激活SecondActivity?(当然,这很有用。)

非常感谢任何答案,puffin137

4

0 回答 0