Android运行时权限的申请

纯纯纯小白学习记录
学习资料:郭霖老师《第一行代码》第2版

在之前的Android版本中,开发者只需要在AndroidMainfest.xml中声明即可,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   ......
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    .........

</manifest>

Android6.0之后系统中引入了运行时权限这个功能,开发者除了在AndroidMainfest.xml声明权限外,还需要在程序运行的过程中动态去申请相应权限

本小白以一个拨打电话的Demo为例

新建一个ActionCallDemo,在MainActivity中绘制一个按钮,按下按钮的时候进行拨打电话操作

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity"
    android:padding="15dp">
<!--拨打电话-->
    <Button
        android:id="@+id/call"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/call_10086"(text文本应在@string中声明,规范代码编写)
        android:textAllCaps="false"/>

</LinearLayout>

MainActivity.clss

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_PHONE_CALL_CODE = 1; // 权限请求码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button mCall = (Button) findViewById(R.id.call);
        mCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 程序运行时申请打电话权限
                // 判断用户是否授权
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    // 用户没有授权,申请权限
                    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL_CODE);
                } 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();
        }
    }

    /**
     * 用户通过ActivityCompat.requestPermissions申请权限之后
     * 都会回调到onRequestPermissionsResult方法中
     * @param requestCode 请求码
     * @param permissions 权限组
     * @param grantResults 授权结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // 判断最后的授权结果
        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 申请权限通过,执行拨打电话操作
                call();
            } else {
                Toast.makeText(this, "您拒绝该权限", Toast.LENGTH_LONG).show();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值