Android 9.0 关于ACTION_CALL无权限导致闪退的问题

18年年底毕业,开始从事android研发,对application层有兴趣,于是自学使用Android studio对app的简单开发。其实上学的时候学了一点用eclipse实现的UI设计,不过现在用着studio,就是 真香。
人生第一篇CSDN的博文,废话不多说,切入主题。

学习到用Intent启用程序的method,跟着书上写了一个拨打电话的示例。Intent的action采用ACTION_CALL, 同时Data采用自己的电话号码。

在XML中添加button,写好布局后,在MainActivity中添加具体函数

 @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void callmyself(View v){//添加button onclick响应函数        Intent it = new Intent();        it.setAction(Intent.ACTION_CALL);//ACTION_CALL实现拨号        it.setData(Uri.parse("tel:+86***********"));//实现具体拨什么号        startActivity(it);    }

书中也提示到要添加拨号权限。在AndroidManifest中添加权限

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.pao.penghao6.test"><uses-permission android:name="android.permission.CALL_PHONE" /> //添加权限<application...................................</application></manifest>

直接运行一下试试。结果再点击button的时候就crash down了。
出现如下结果
Android 9.0 关于ACTION_CALL无权限导致闪退的问题_第1张图片
log如下:

.at com.pao.penghao6.test.twoActivity.callmyself(MainActivity.java:33)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1788)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:717)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)

显然这么简单的程序,如果不是SDK对Intent有很大的更新的话,因该不是这些内置函数的问题,看log还是不懂发生了什么。

后来想如果ACTION_CALL导致activity起不来的话,那我可以换一个可以起来的action,来验证问题就是ACTION_CALL。
于是修改了setAction

it.setAction(Intent.ACTION_VIEW);

再次运行,于是得到一下结果
Android 9.0 关于ACTION_CALL无权限导致闪退的问题_第2张图片
能够正确打开拨号界面,并填入data的数据,ACTION_CALL实现。这样确定了问题就是出在ACTION_CALL这里

于是又百度了好久。很多博文都说需要确认权限是否添加。但之前已经在AndroidManifest中添加。所以一直没想通。直到看到一个回复说Android6以上需要动态开启权限。这才回归正道。于是查阅动态开启权限的方法。修改代码如下

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_two);    }    public void goback(View v){        finish();    }    public void callmyself(View v){        Intent it = new Intent();        //调用checkSelfPermission检查是否有权限        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)== PackageManager.PERMISSION_GRANTED) {            it.setAction(Intent.ACTION_CALL);//有权限则直接ACTION_CALL            it.setData(Uri.parse("tel:+86***********"));            startActivity(it);        }else{            ActivityCompat.requestPermissions(this,new String []{Manifest.permission.CALL_PHONE},1);//无权限则询问开启权限            it.setAction(Intent.ACTION_CALL);            it.setData(Uri.parse("tel:+86***********"));            startActivity(it);        }    }

最终终于看到询问权限开启的提示框
Android 9.0 关于ACTION_CALL无权限导致闪退的问题_第3张图片
用实机run,收到来电。
Android 9.0 关于ACTION_CALL无权限导致闪退的问题_第4张图片

总结
1.需要在AndroidManifest中添加权限
2.对较新版本的Android,需要采用动态权限调用

更多相关文章

  1. Android操作系统安全(分层结构、应用沙盒、安全进程通信、Android
  2. Android 6.0 运行时权限的处理
  3. ReactNative Android 实现加载本地图片
  4. [转]android 安全与权限(Security and Permissions)(翻译)
  5. 认识Android的UID(Unix user ID)与权限
  6. Android Tween动画之RotateAnimation实现图片不停旋转
  7. [android]android权限体系深入分析
  8. android:scaleType="matrix"布局文件加载图片时候的显示方式
  9. android Matrix处理图片原理及方法整理

随机推荐

  1. spring cloud+spring boot+redis社交电子
  2. cocos2d-x 3.16 Lua android studio 打包
  3. android改变CheckBox的样式
  4. 设置android编码格式与包的引入格式于源
  5. Android(安卓)studio如何使用SVN进行版本
  6. android Toast大全(五种情形)
  7. Android异步AsyncTask二三解
  8. Android(安卓)Service的说明和注意事项
  9. Android中打开网络设置界面
  10. android监控SIM卡状态的广播示例代码