This lesson teaches you to
Dependencies and Prerequisites
Android 6.0 (API level 23)
You should also read
Beginning in Android 6.0 (API level 23), users grant permissions to
apps while the app is running, not when they install the app. This
approach streamlines the app install process, since the user does
not need to grant permissions when they install or update the app.
It also gives the user more control over the app's functionality;
for example, a user could choose to give a camera app access to the
camera but not to the device location. The user can revoke the
permissions at any time, by going to the app's Settings screen.
翻译下:
在运行时请求权限
这节课教你
依赖和先决条件
Android 6.0(API级别23)
你也应该读
从Android 6.0(API级别23)开始,用户授权 权限的应用程序在应用程序运行时,而不是当他们安装应用程序。
这种方法简化了应用程序 安装过程,因为用户不需要时给予权限 安装或更新应用程序。这也给了用户更多的控制程序
功能;例如,一个用户可以选择相机应用程序访问 相机而不是设备的位置。 用户可以撤销
权限在任何时候,通过将应用程序的设置屏幕。
系统权限分为两类,正常的和危险:
正常的权限不直接用户的隐私风险。
如果你的应用 列出了一个正常的许可在其清单,系统授予许可 自动。
危险的权限可以给应用程序访问用户的机密 数据。 如果你的应用程序清单列出了一个正常的权限,系统 自动授予许可。
如果你列出一个危险的许可, 用户必须显式地给应用程序审批。
所以就电话拨号器来说不仅仅是在清单文件中声明打电话权限,还要在用到打电话的地方告诉用户我需要你的打电话权限并且提供友好界面给用户选择:
如图:
关键代码如下:
packagecom.example.administrator.callphone;importandroid.content.Intent;importandroid.content.pm.PackageManager;importandroid.net.Uri;importandroid.os.Build;importandroid.os.Bundle;importandroid.support.v4.app.ActivityCompat;importandroid.support.v4.content.ContextCompat;importandroid.support.v7.app.AppCompatActivity;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;public classMainActivity extendsAppCompatActivity {
privateEditText et;privateButton button;//@TargetApi(Build.VERSION_CODES.M)protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.main);button= (Button) this.findViewById(R.id.button);et= (EditText) this.findViewById(R.id.et);//第二种设置监听事件的方法// button.setOnClickListener(new ButtonClickListener());button.setOnClickListener(newView.OnClickListener() {
public voidonClick(View v) {
if(Build.VERSION.SDK_INT>= 23) {
//检查程序是否具备了拨打电话的授权inti = ContextCompat.checkSelfPermission(MainActivity.this,android.Manifest.permission.CALL_PHONE);//返回值为int类型//PackageManager为程序的管理者if(i == PackageManager.PERMISSION_DENIED)//如果发现没有授权则申请授权1表示请求码{
ActivityCompat.requestPermissions(MainActivity.this, newString[]{android.Manifest.permission.CALL_PHONE},1);return;//没有返回值}
//如果还没有授权则申请权限} else{
String phoneNum = et.getText().toString();Intent intent1 = newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+ phoneNum));startActivity(intent1);}
}
});}
//权限的回调方法 用户在对话框选择权限以后就返回到这个方法requestCode表示第一个则是返回请求码public voidonRequestPermissionsResult(intrequestCode,String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode,permissions,grantResults);if(requestCode == 1) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
String phoneNum = et.getText().toString();Intent intent = newIntent();intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse("tel"+ phoneNum));}
}
}
}
运行结果: