1.总结昨天朋友问到的一探讨问题,具体需求是:从一App中点击QQ号跳转到腾讯手Q中,这个需求应该很简单吧!
1.简单贴下代码:
String qqPackageName = "com.tencent.mobileqq"; startActivity(getPackageManager().getLaunchIntentForPackage(qqPackageName));
2.就是这么简单,两行代码就完成两个应用间的的跳转,那么万一用户手机没安装手Q呢?继续代码
3.增加需求,如果当前用户的手Q是登录状态的,直接跳转到当前点击QQ号码的聊天界面,还是代码
String qqPackageName = "com.tencent.mobileqq"; String qq = "123456987"; String url = "mqqwpa://im/chat?chat_type=wpa&uin=" + qq; PackageManager manager = getPackageManager(); List<PackageInfo> installedPackages = manager.getInstalledPackages(PackageManager.GET_INSTRUMENTATION); for (PackageInfo info : installedPackages) { String packageName = info.packageName; if (TextUtils.equals(packageName, qqPackageName)) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return; } else { if (installedPackages.size() - 1 == installedPackages.indexOf(info)) { Toast.makeText(MainActivity.this, "经测试,本地未安装QQ", Toast.LENGTH_LONG).show(); } }
4.出现一问题,关乎权限的,备注:测试机为华为,版本为23
截图:
5.在点击禁止后再次点击按钮,按钮毫无反应,开发中还从没注意到 “读取已安装应用列表” 这权限,从as的日志中也找不到对应的action等信息,搜索华为和CSDN的论坛,想找找答案,都找不到答案,在华为的论坛也有人提问这问题,无人回帖;在csdn论坛上看到一帖子说 这是华为自家搞出来的权限,继续调试,最后仍然无果(备注:望 走过路过的大牛指点迷津)
2.as的日志都找不到相关的信息提示,考虑是否日志问题
1.call phone的小例子拿来试试
记得:<uses-permission android:name="android.permission.CALL_PHONE"/> String num = "12345678910"; Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+num)); startActivity(intent);
2.异常 总是来得这么的突然
java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:5264) at android.view.View$PerformClick.run(View.java:21297) at android.os.Handler.handleCallback(Handler.java:743) at android.os.Handler.dispatchMessage(Handler.java:95) ... Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{3f02f61 24776:com.wyk.okhttp.okhttpdemo01/u0a754} (pid=24776, uid=10754) with at android.os.Parcel.readException(Parcel.java:1602) at android.os.Parcel.readException(Parcel.java:1555) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
3.郁闷了去,6.0权限问题咯,那么就玩玩6.0权限问题,还是用代码说话!
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //向系统请求权限了,这里我还做了一个判断. sdk是M(M = 23 android L)才做这个请求,否则就不做. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{"android.permission.CALL_PHONE"}, 001); } return ;}//Manifest.permission.CALL_PHONE callPhoneIng(); } private void callPhone(){ String num = "12345678910"; Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+num)); startActivity(intent); }
4.看看代码,也不是多难,有很多库对其进行了封装,可以在github首页搜索:android permission,具体的 参考博客:http://blog.csdn.net/lmj623565791/article/details/50709663
5.API
ContextCompat.checkSelfPermission,用于检测某个权限是否已经被授予, ” PackageManager.PERMISSION_GRANTED “表示已经同意授权
用于申请权限,第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测
ActivityCompat.requestPermissions(activity,
new String[]{“android.permission.CALL_PHONE”},
001);@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
//该方法主要用于 权限申请 回调,
}当用户第一次拒绝权限申请,你第二次又弹出授权框,最好还是在这里对权限进行说明,考虑用户体验
ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.CALL_PHONE)
3.回到华为出现的 ” 读取已安装应用列表 “这一问题
- 1.从日志上可以看到 “Manifest.permission.CALL_PHONE” ,说明了as 没欺骗了我感情
- 2.郁闷了,谁来解我忧愁!!!
4.总结:
记录 : 华为机 的 “读取已安装应用列表” 有待大牛指点迷津,西天取经
6.0的各类权限大致都是:检测权限,申请权限,权限回调 这几步骤,还需继续探索其他权限有无不同之处
9月到了,好好学习,天天向上 …