Android 6.0ランタイム権限.

5757 ワード

Android 6.0以降、ユーザーのプライバシーをよりよく保護するために、Googleはランタイム権限メカニズムを追加しました.6.0以前、アプリをインストールするときは、多くの権限を受け入れる必要があります.6.0以降、グーグルは危険権限をアプリを使用する際にユーザー自身の必要に応じて手動で授権する必要があると規定している.
6.0以降、主に2つの権限があります.1つはNormal Permissionsで、このような権限はプライバシーに関与せず、携帯電話の振動、ネットワークへのアクセスなどのユーザーの権限を必要としません.1つはDangerous Permissionsで、このような権限はプライバシーに関連しており、SDカードの読み取り、通信録へのアクセスなど、ユーザーの許可が必要です.ユーザー操作の面では、機密操作を実行する前にダイアログボックスをポップアップし、権限を要求し、拒否することができ、同意することができる.設定ページでAPPの権限を表示したり、単一の権限を付与したり、権限を解除したりすることができます.
次は、この2つの権限の詳細リストです.
NormalPermissions

WRITE_SYNC_SETTINGS      
WAKE_LOCK    
VIBRATE   
USE FINGERPRINT     
UNINSTALL_SHORTCUT       
TRANSMIT_IR     
SET_WALLPAPER_HINTS       
SET_WALLPAPER     
SET_TIME_ZONE     
SET_ALARM     
REQUEST_INSTALL_PACKAGES      
REORDER_TASKS        
RECEIVE_BOOT_COMPLETED       
READ_SYNC_STATS      
NFC
MODIFY_AUDIO_SETTINGS       
KILL_BACKGROUND_PROCESSES       
INTERNET   
INSTALL_SHORTCUT       
GET PACKAGE SIZE       
EXPAND_STATUS_BAR      
DISABLE_KEYGUARD       
CHANGE_WIFI_STATE         
CHANGE_WIFI_MULTICAST_STATE         
CHANGE_NETWORK_STATE       
BROADCAST_STICKY     
BLUETOOTH_ADMIN     
BLUETOOTH     
ACCESS_WIFI_STATE         
ACCESS_NOTIFICATION_POLICY       
ACCESS_NETWORK_STATE       
ACCESS_LOCATION_EXTRA_COMMANDS          

Dangerous Permissions(9グループ24個):
group:android.permission-group.CONTACTS       
permission:android.permission.WRITE_CONTACTS       
permission:android.permission.GET_ACCOUNTS         
permission:android.permission.READ_CONTACTS      

group:android.permission-group.PHONE      
permission:android.permission.READ_CALL_LOG       
permission:android.permission.READ_PHONE_STATE        
permission:android.permission.CALL_PHONE     
permission:android.permission.WRITE_CALL_LOG        
permission:android.permission.USE_SIP   SIP 
permission:android.permission.PROCESS_OUTGOING_CALLS        permission:com.android.voicemail.permission.ADD_VOICEMAIL       

group:android.permission-group.CALENDAR    
permission:android.permission.READ_CALENDAR      
permission:android.permission.WRITE_CALENDAR      

group:android.permission-group.CAMERA     
permission:android.permission.CAMERA

group:android.permission-group.SENSORS     
permission:android.permission.BODY_SENSORS     

group:android.permission-group.LOCATION    
permission:android.permission.ACCESS_FINE_LOCATION       
permission:android.permission.ACCESS_COARSE_LOCATION     group:android.permission-group.STORAGE    
permission:android.permission.READ_EXTERNAL_STORAGE         
permission:android.permission.WRITE_EXTERNAL_STORAGE       

group:android.permission-group.MICROPHONE    ;    
permission:android.permission.RECORD_AUDIO   

group:android.permission-group.SMS    
permission:android.permission.READ_SMS      
permission:android.permission.RECEIVE_WAP_PUSH   WAP   
permission:android.permission.RECEIVE_MMS      
permission:android.permission.RECEIVE_SMS     
permission:android.permission.SEND_SMS     
permission:android.permission.READ_CELL_BROADCASTS      

注意:Dangerous Permissionsリストの権限はグループ化されています.
ある危険な権限を申請するとき、同じグループの権限の中のある権限をすでに許可している場合、システムはすぐに権限を許可し、再び権限をクリックする必要はありません.ただし、権限グループに過度に依存しないで、後期のバージョンではこの権限グループが変化する可能性があるため、可能な限り各危険権限に対して正常なプロセスの申請を行う必要があります.
Demo
package apps.gzgi.com.android6permission;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity{
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button= (Button) findViewById(R.id.call);
        button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    call();
                }
        }
    });
    }
    private  void  call(){
        try {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }
}

コードの中で電話をシミュレートして、まずユーザーが私たちに権限を与えたかどうかを判断して、ContextCompat.checkSelfPermissionの方法を借りています.メソッドは2つのパラメータを受信します.1つ目のパラメータはContextで、2つ目のパラメータは特定の権限名Manifest.permission.CALL_です.PHONEは、メソッドの戻り値とPackageManager.PERMISSION_を使用します.GRANTED(権限許可)を比較すると、等しいのはすでに許可されていることを示し、等しくないのは許可されていないことを示します.授権されたら電話をかける操作を実行し、授権されていない場合はActivity Compat.requestPermissions法を利用してお客様に授権を申請し、3つのパラメータを受信します.1つ目のパラメータはActivityの例で、2つ目のパラメータはString配列で、申請する権限名を配列に置けばいいです.3つ目のパラメータは要求コードで、唯一の値であればいいです.ここに1が伝わった.
Activity Compat.requestPermissionsメソッドを呼び出すと、権限申請のダイアログ・ボックスがポップアップされ、ユーザーは権限申請に同意するか拒否するかを選択できます.どちらを選択しても、onRequestPermissionsResultメソッドが呼び出されます.許可された結果はgrantResultsパラメータにカプセル化されます.grantResultsに格納されているのは、私たちの申請権限時の配列の内容です.new String[]{Manifest.permission.CALL_PHONE}です.grantResultsの長さが0より大きく、その権限がPackageManager.PERMISSION_に等しい場合です.GRANTED、それは許可が成功したことを意味します.では、ここでは授権結果を判断するだけでいいです.ユーザーが同意すればcallメソッドを呼び出して電話をかけ、同意しなければ失敗のヒントをポップアップすればいいです.さっき同意した権限に後悔した場合は、設定-アプリケーション-権限管理で削除したい権限を除去するだけです.