package com.diygreen.android6new.newapi; import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Switch; import android.widget.Toast; import com.diygreen.android6new.R; public class DynamicPermissionActivity extends AppCompatActivity implements LocationListener { static private final String TAG = "DynamicPermission"; private static final String PACKAGE_URL_SCHEME = "package:"; // 方案 private static final int REQUEST_CODE_ASK_EXTERNAL_STORAGE_PERMISSON = 111; static private final int REQUEST_CODE_ASK_AUDIO_PERMISSION = 0; // 请求码 static final String[] EXTERNAL_STORAGE_PERMISSIONS = new String[]{ // 所需的全部权限 Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; static final String[] AUDIO_PERMISSIONS = new String[]{ // 所需的全部权限 Manifest.permission.RECORD_AUDIO, Manifest.permission.MODIFY_AUDIO_SETTINGS }; private PermissionsChecker mPermissionsChecker; // 权限检测器 private Switch mCheckSwitch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamicpermission); initView(); initData(); } private void initView() { this.mCheckSwitch = (Switch) findViewById(R.id.switch_checkpermission); } private void initData() { mPermissionsChecker = new PermissionsChecker(this); } public void onClick(View v) { switch (v.getId()) { case R.id.btn_getlocation: getLocation(); break; case R.id.btn_testsdcardpermission: testSDCardPermission(); break; case R.id.btn_testaudiopermission: testAudioPermission(); break; } } public void getLocation() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); } private void testSDCardPermission() { if (mCheckSwitch.isChecked()) { // 1. 判断是否有权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 在弹出权限选择的对话框前给用户show一个dialog,用于引导用户进行选择 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // 解释为什么要申请权限 showMessage("测试一下对SD卡进行读写操作", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startAppSettings(); } }); return; } ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_EXTERNAL_STORAGE_PERMISSON); } else { Toast.makeText(DynamicPermissionActivity.this, "有权限了开始读写SD卡吧!", Toast.LENGTH_LONG).show(); } } else { // 1. 判断是否有权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 2. 弹出对话框申请权限给用户选择 // 第二个参数code与onRequestPermissionResult()方法中的code对应 ActivityCompat.requestPermissions(this, EXTERNAL_STORAGE_PERMISSIONS, REQUEST_CODE_ASK_EXTERNAL_STORAGE_PERMISSON); } else { Toast.makeText(DynamicPermissionActivity.this, "有权限了开始读写SD卡吧!", Toast.LENGTH_LONG).show(); } } } private void testAudioPermission() { // 缺少权限时, 进入权限配置页面 if (mPermissionsChecker.lacksPermissions(AUDIO_PERMISSIONS)) { startPermissionsActivity(); } } private void showMessage(String message, DialogInterface.OnClickListener okListener) { new AlertDialog.Builder(this) .setMessage(message) .setNegativeButton("取消", null) .setPositiveButton("设置", okListener).create().show(); } // 启动应用的设置 private void startAppSettings() { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName())); startActivity(intent); } private void startPermissionsActivity() { PermissionsActivity.startActivityForResult(this, REQUEST_CODE_ASK_AUDIO_PERMISSION, AUDIO_PERMISSIONS); } //==========申请权限结果回调========== // 判断用户是否确认了权限 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_EXTERNAL_STORAGE_PERMISSON: // Permission Granted if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(DynamicPermissionActivity.this, "用户确认授权操作SD卡权限", Toast.LENGTH_SHORT).show(); } else { // Permission Denied Toast.makeText(DynamicPermissionActivity.this, "用户拒绝授权操作SD卡权限", Toast.LENGTH_SHORT).show(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); break; } } //==========获取位置信息回调========== @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } //==========其他生命周期方法========== @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 拒绝时, 关闭页面, 缺少主要权限, 无法运行 if (requestCode == REQUEST_CODE_ASK_AUDIO_PERMISSION && resultCode == PermissionsActivity.PERMISSIONS_DENIED) { Log.e(TAG, "缺少主要权限, 无法运行"); } } }