Android에서 사용자 지정 권한을 사용하는 방법은 무엇입니까?
두 가지 응용 프로그램이 있습니다.
하나는 권한을 선언하고 단일 Activity
:
AndroidManifest.xml의 일부
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:permission="your.namespace.permission.TEST" >
<activity
android:name=".DeclaringPermissionActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp"
android:host="myapp.mycompany.com" />
</intent-filter>
</activity>
</application>
두 번째는 사용 권한을 선언합니다.
AndroidManifest.xml의 일부
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="your.namespace.permission.TEST" />
<application
일부 Activity
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("myapp://myapp.mycompany.com/index")));
}
권한을 선언하는 애플리케이션을 설치 한 다음 두 번째 애플리케이션을 실행합니다.
결과적으로 보안 예외가 발생합니다.
01-11 09:46:55.249: E/AndroidRuntime(347): java.lang.RuntimeException: Unable to start activity ComponentInfo{your.namespace2/your.namespace2.UsingPErmissionActivity}: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=myapp://myapp.mycompany.com/index cmp=your.namespace/.DeclaringPermissionActivity } from ProcessRecord{407842c0 347:your.namespace2/10082} (pid=347, uid=10082) requires your.namespace.permission.TEST
사용하고 권한을 테스트 할 수있는 테스트 코드를 만들었습니다. 권한을 선언하고이 권한으로 활동을 보호하는 두 개의 애플리케이션 PermissionTestClient가 있습니다. 다음은 매니페스트 파일입니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testpackage.permissiontestclient"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<permission android:name="com.testpackage.mypermission" android:label="my_permission" android:protectionLevel="dangerous"></permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:permission="com.testpackage.mypermission"
android:name=".PermissionTestClientActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter >
<action android:name="com.testpackage.permissiontestclient.MyAction" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
활동 파일에는 특별한 것이 없으므로 여기서는 표시하지 않겠습니다.
PermissionTestServer 애플리케이션은 PermissionTestClient에서 활동을 호출합니다. 다음은 매니페스트 파일입니다.
<?xml version="1.0" encoding="utf-8"?>
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="com.testpackage.mypermission"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".PermissionTestServerActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
그리고 활동 :
package com.testpackage.permissiontestserver;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class PermissionTestServerActivity extends Activity {
private static final String TAG = "PermissionTestServerActivity";
/** Called when the activity is first created. */
Button btnTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnTest = (Button) findViewById(R.id.btnTest);
btnTest.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Button pressed!");
Intent in = new Intent();
in.setAction("com.testpackage.permissiontestclient.MyAction");
in.addCategory("android.intent.category.DEFAULT");
startActivity(in);
}
});
}
}
To test it just remove uses-permission from Server application. You'll get security violation error.
You need to create a permission in your base app's manifest by declaring it exclusively. For example:
<permission android:name="your.namespace.permission.TEST"
android:protectionLevel="normal" android:label="This is my custom permission" />
And later make use of it in your desired app as:
<uses-permission android:name="your.namespace.permission.TEST" />
Note: It is vital to maintain the order in which you install your applications with custom permissions. i.e You must need to install that app first which declares the permission and later install the one which makes use of it. Any disruption in this order may break the usage of custom. permissions.
As mentioned in the answers, you should also take into account the order you install the apps.
this is important because:
if the App that requests the permission (App B) is installed before the App that defines the permission (App A), then there will be no such defined permission in the specific device so the OS won't ask for the permission at all.
later on, when you install the App A and try to run App B, the latter will fail to access the secure component.
One workaround would be to define the same custom permission in both Apps, A and B in order to make sure that the permission exists in the device regardless of which App is installed first, so when the App A is installed, the permission will be already granted to App B.
In that case though, you should make sure that the protection level is the same in both declarations because this can lead to security risk.
(note here that from android 5.0 and on you cannot define the same permission in more than one App, except when those Apps are signed with the same signature key).
Defining custom permission is done using <Permission>
tag.. Please follow the link below to use user defined permissions in application:
Declaring and Enforcing Permissions
ReferenceURL : https://stackoverflow.com/questions/8816623/how-to-use-custom-permissions-in-android
'Nice programing' 카테고리의 다른 글
목표 c, 경로에 파일이 있는지 확인 (0) | 2020.12.28 |
---|---|
Node.js-EJS-부분 포함 (0) | 2020.12.28 |
파이썬에서 튜플을 뒤집는 방법? (0) | 2020.12.28 |
“허가가 아닌 용서를 구하십시오”-설명 (0) | 2020.12.28 |
Sidekiq가 대기열을 처리하지 않음 (0) | 2020.12.28 |