web-dev-qa-db-ja.com

プログラムによるユーザーからのアクセス許可の要求?

初めてアプリを開いた直後に承認するための権限のリストをユーザーに与える機能を追加したいと思います。

これを行う方法について this の記事を読みます。

しかし、私はまだこれについていくつかの質問があります。私のアプリのこの機能を本当に動的にするためです:

  • 必要な権限のリストをマニフェストファイルから読み取る方法は? (これは、必要な各権限の明示的なハードコード検証を回避するため)

  • プログラムでこれらの権限をとして分類する方法[〜#〜]通常[〜#〜][〜#〜] dangerous [〜#〜]ので、許可が危険な種類? (ドキュメントによると、通常権限は、ユーザーに要求せずにOSによって自動的に付与されます)

6
SoulRayder

その権限に関連する操作を実行する場合は、アプリに天気の権限が付与されるかどうかを確認する必要があります。

ユーザーはいつでも設定からその権限を無効にすることができるからです。

危険な権限と権限グループ:

[〜#〜]カレンダー[〜#〜]

READ_CALENDAR
WRITE_CALENDAR

CALL_LOG

READ_CALL_LOG 
WRITE_CALL_LOG 
PROCESS_OUTGOING_CALLS

[〜#〜]カメラ[〜#〜]

CAMERA

[〜#〜]連絡先[〜#〜]

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS

[〜#〜]場所[〜#〜]

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION

[〜#〜]マイク[〜#〜]

RECORD_AUDIO

[〜#〜]電話[〜#〜]

READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS
ADD_VOICEMAIL
USE_SIP

[〜#〜]センサー[〜#〜]

BODY_SENSORS

[〜#〜] sms [〜#〜]

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_Push
RECEIVE_MMS

[〜#〜]ストレージ[〜#〜]

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

ソース 危険な権限

通常の権限:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
FOREGROUND_SERVICE
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MANAGE_OWN_CALLS
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_COMPANION_RUN_IN_BACKGROUND
REQUEST_COMPANION_USE_DATA_IN_BACKGROUND
REQUEST_DELETE_PACKAGES
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
SET_ALARM
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

ソース 通常の権限

必要な権限のリストをプログラムで取得します:

public void readPermission()
{
    try {
        PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                Log.d(TAG, "Permission : " + p);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
7
Priyank Patel

私の知る限り、プログラムでマニフェストからすべての権限を読み取る方法はありません。ただし、APKをリリースする前にマニフェストにそれらが既にリストされているため、要求する必要がある権限はすでにわかっています。ね?

マニフェストにREAD_PHONE_STATEおよびWRITE_EXTERNAL_STORAGEがあるとします。これをMainActivity.Javaの権限チェックに追加できます。

ArrayList<String> arrPerm = new ArrayList<>();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.READ_PHONE_STATE);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!arrPerm.isEmpty()) {
    String[] permissions = new String[arrPerm.size()];
    permissions = arrPerm.toArray(permissions);
    ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST);
}

これにより、WRITE_EXTERNAL_STORAGEとREAD_PHONE_STATEの両方の権限要求が次々にトリガーされます。付与されている権限を確認するには、次の操作を行います。

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0) {
                for(int i = 0; i < grantResults.length; i++) {
                    String permission = permissions[i];
                    if(Manifest.permission.READ_PHONE_STATE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                    if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                }
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            break;
        }
    }

    // other 'case' lines to check for other
    // permissions this app might request
}
2
user1506104

<uses-permission Android:name = "..." />を使用してマニフェストで定義されている権限は、Android APIレベルが23未満のデバイスでは自動的に機能します。Android(6.0)、実行時に権限を確認する必要があります。

https://developer.Android.com/guide/topics/security/permissions.html このリンクには危険な権限のリストがあります

0
Jay Pandya

ランタイム権限はAndroid from Android 6.0(API level 23))に追加されますが、その前に権限はマニフェストでのみ定義する必要があります。ただし、Android 6以上の場合、タスクを実行する直前にユーザーからランタイム権限(危険)を取得する必要があります。

問題のドキュメントから

アプリに危険な権限が必要な場合は、その権限が必要な操作を実行するたびに、その権限があるかどうかを確認する必要があります。

したがって、危険の許可が必要なタスクを実行している場合は、ユーザーにそれを実行するように依頼する必要があります。それ以外の場合は、ランタイム例外がスローされます。

あなたは this を読んで、最良の方法で権限を取得することができます

0
Bills