1.0 APP在程序內(nèi)部進(jìn)行操作纺涤,當(dāng)然是安全的且合理的帖努,但不同應(yīng)用程序之間如何進(jìn)行數(shù)據(jù)訪問棠众?比如這個(gè)例子琳疏,需要自己的APP利用到手機(jī)上的撥打電話權(quán)限。
2.0 在Android6.0系統(tǒng)之后闸拿,Android開發(fā)團(tuán)隊(duì)引用了運(yùn)行時(shí)權(quán)限這個(gè)功能空盼,終于可以出“店大欺客”這口惡氣,這樣即使我們不賦予APP某項(xiàng)權(quán)限新荤,仍可以安裝并使用該軟件揽趾。
這個(gè)網(wǎng)站有關(guān)于Android系統(tǒng)中完整的權(quán)限列表:
鏈接:Android API:Manifest.permission權(quán)限清單
2019-02-19_211110.png
(不好意思,瀏覽器已中文翻譯苛骨,雖然這翻譯是磕磣了點(diǎn))
3.0 話不多說篱瞎,通過一個(gè)簡單的小例子,體驗(yàn)一把到底什么是Android運(yùn)行時(shí)權(quán)限
新建項(xiàng)目痒芝,RuntimePermissionTest俐筋,目錄結(jié)構(gòu)如下:
2019-02-19_203507.png
4.0 在activity_main.xml中放一個(gè)button按鈕控件。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".MainActivity">
<Button
android:id="@+id/make_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="撥打電話"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.05" />
</android.support.constraint.ConstraintLayout>
5.0 接著在AndroidManifest.xml中增加一行<uses-permission android:name="android.permission.CALL_PHONE"/>
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.runtimepermissiontest">
<uses-permission android:name="android.permission.CALL_PHONE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
6.0 MainActivity.java严衬,說明都在代碼里澄者,總之步驟分為三步走。
package com.example.runtimepermissiontest;
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;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button makeCall = (Button) findViewById(R.id.make_call);
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//第一步,判斷用戶是否給應(yīng)用授權(quán)了
//借助ContextCompat.checkSelfPermission()方法
//該方法接收兩個(gè)參數(shù)一個(gè)是上下文粱挡,沒什么好說的赠幕。
//第二個(gè)是具體的權(quán)限名
//然后把方法的返回值和PackageManager.PERMISSION_GRANTED作比較,相等說明用戶已經(jīng)授權(quán)
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//第二步询筏,如果不等于榕堰,則需要調(diào)用 ActivityCompat.requestPermissions()方法來向用戶申請(qǐng)權(quán)限
//該方法接收三個(gè)參數(shù),第一個(gè)要求是Activity的實(shí)例
//第二個(gè)是一個(gè)String數(shù)組嫌套,把需要申請(qǐng)的權(quán)限名放入數(shù)組即可
//第三個(gè)是請(qǐng)求碼逆屡,是唯一值即可,這里用的“1”
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:10010"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
//第三步灌危,調(diào)用完requestPermissions()方法后康二,系統(tǒng)會(huì)彈出一個(gè)權(quán)限申請(qǐng)的對(duì)話框
// 無論結(jié)果如何,最終都會(huì)回調(diào)onRequestPermissionsResult()方法
//授權(quán)的結(jié)果勇蝙,會(huì)封裝在grantResults中沫勿。
// 判斷一下,如果同意了授權(quán)就打電話味混,沒有就涼涼了……
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
} else {
Toast.makeText(this, "抱歉产雹,沒有該權(quán)限!", Toast.LENGTH_SHORT).show();
}
}
}
}
7.0 跑一下翁锡,最后的效果如下:
點(diǎn)擊“撥打電話”蔓挖,提示如下:
2019-02-19_202643.png
選擇,拒絕:
2019-02-19_202705.png
選擇允許:
2019-02-19_202716.png
END