注意:在学习内容提供者之前请看我发的博客 数据存储的!
简介:内容提供器主要用在不同应用程序之间实现数据共享功能,跟数据存储不同,数据存储所保存的数据都只能在当前的应用当中访问。但是内容提供者它提供了一套完整的机制允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性;
首先新建一个RuntimePermissionTest项目。修改acticvity_main.xml布局文件:
功能:添加拨打电话的按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/make_call"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Make Call" />
</LinearLayout>
接着修改MainActivity中的代码: 功能:实现点击拨打电话按钮,拨打电话 电话:10086
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) {
try {
//构建隐式Intent,Intent的action指定为Intnet.Action_Call.这是一个系统内置的打电话动作
Intent intent = new Intent(Intent.ACTION_CALL);
//data部分指定协议是tel,号码是10086.Intent.ACTION_CALL是直接打电话,Intent_.ACTION_DIAL是打开拨号界面,不需要声明权限
//而Intent.ACTION_CALL必须声明权限
intent.setData(Uri.parse("tel:10086"));
//启动拨打电话 。但是低于Android6.0上可以正常运行,但是如果在Android6.0或者更高的版本的手机上运行,点击make Call
//按钮一点都没有效果。观察logcat中的打印日志会看到一条错误 : Permission Denial。解释:由于权限禁止所导致的。因为Android6.0以 及以上系统使用危险权限是都必须运行时权限处理!
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
});
}
}
代码完成之后需要声明拨打电话的权限,其实如果你忘记声明Android Stdio会提示你声明权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
刚刚在代码里说了,如果在Android6.0以及以上版本运行这个程序,点击Make Call按钮就没有任何效果的。因此我们来修复这个问题,修改MainActivity中的代码:
功能:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button makeCall = (Button) findViewById(R.id.make_call);
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1、判断用户是否给应用授权,借助ContextCompat.checkSelfPermission方法。checkSelfPermission()方法接收两个参数,第一个是Context,第二个具体权限名,比如打电话权限名
//即Manifest.permission.CALL_PHONE
// 然后使用方法的返回值和PackageManager.Permission_GRANTED,相等就说明用户以及授权了,不等表示用户没有授权。
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
//如果没有授权,就需要调用ActivityCompat.requestPermissions()方法接收3个参数。
//参数一:Activity实例 参数二:String数组 参数三:请求码,只要是唯一值就行,这里传入1
//调用完这个方法会弹出一个权限申请对话框,然后用户可以选择同意或者拒绝我们的权限申请
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}else {
//如果授权执行拨打电话
Call();
}
}
});
}
private void Call(){
try {
//构建隐式Intent,Intent的action指定为Intnet.Action_Call.这是一个系统内置的打电话动作
Intent intent = new Intent(Intent.ACTION_CALL);
//data部分指定协议是tel,号码是10086.Intent.ACTION_CALL是直接打电话,Intent_.ACTION_DIAL是打开拨号界面,不需要声明权限
//而Intent.ACTION_CALL必须声明权限
intent.setData(Uri.parse("tel:10086"));
//启动拨打电话 。但是低于Android6.0上可以正常运行,但是如果在Android6.0或者更高的版本的手机上运行,点击make Call
//按钮一点都没有效果。观察logcat中的打印日志会看到一条错误 : Permission Denial。解释:由于权限禁止所导致的。因为Android6.0以及以上系统使用危险权限是都必须运行时权限处理!
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
/**
* 不论是哪一种结果,最终会回调OnRequsetPermissionResult()方法中,而授权的结果则会封装到grantResult参数当中
* 我们只需要判断最后的授权结果,如果用户同意则调用call()方法来拨打电话,如果用户拒绝我们咋放弃!
* 会弹出一个操作失败的提示
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Call();
}else {
Toast.makeText(MainActivity.this, "操作失败!你拒绝了这个权限请求", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
}
通过这个方法则可以实现拨打电话的功能!