(知识在于积累!)
在html页面中点击某个Button,获取是否可以访问电话本的权限,如果同意权限,则可获取到电话本数据,也可实现过滤功能(html页面获取Native返回的电话本数据)
1. Native加载html页面(利用WebView标签,百度上有很多)
2.Js调用android(html页面触发请求电话本权限)
js:
$("#mybutton").click(function(){
phoneNumBook.getPhoneBook(); //安卓传过来的 变量.方法名() (js调用安卓)
})
init(){//ember.js框架
window.phonenumber = this;//提供给安卓来调用的全局变量
},
getPhoneNumber(jsonObj){//提供给安卓来调用的全局函数
//可以用两个数组来进行过滤,一个是原数组保持不变,另一个是时时过滤的结果数组
},
android:
在onCreateView方法中声明:
webView = (WebView) v.findViewById(R.id.web_content);
webView.addJavascriptInterface(new PhoneNumberBookInterface(), "phoneNumBook");//传给js的变量phoneNumBook
然后生成对应的函数:
public class PhoneNumberBookInterface() extends Object {
@JavascriptInterface
public void getPhoneBook() {//js中实际调用的安卓方法
if(ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.READ_CONTACTS)!=PackageManager.PERMISSION_GRANTED) {//检验访问权限
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_CONTACTS}, 1);
}else{
readContacts();//已经同意权限,直接读取
}
}
}
public void readContacts() {
final JSONArray phone_numJsonArray = new JSONArray();
JSONObject phone_tmpObj = null;
Cursor cursor = null;
try {
//query contacts
cursor = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY);
while(cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); //contacts name
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //contacts number
phone_tmpObj = new JSONObject();
phone_tmpObj.put("name", displayName);
phone_tmpObj.put("phonenumber", number);
phone_numJsonArray.put(phone_tmpObj);
}
if(phone_numJsonArray.length()>0){
final String phone_numInfos = phone_numJsonArray.toString(); // JSONArray to String
webView.post(new Runnable() {
@Override
public void run() {//把电话本数据传递给js (安卓调用js) phonenumber是js的变量
webView.loadUrl("javascript:window.phonenumber.getPhoneNumber(" + phone_numInfos + ")");
}
});
}else{
final String phone_numInfos = "";
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:window.phonenumber.getPhoneNumber(" + phone_numInfos + ")");
}
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
电话本权限处理:
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
readContacts();//读取联系人数据
}else{//未同意权限的
final String phone_numInfos = "";
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:window.phonenumber.getPhoneNumber(" + phone_numInfos + ")");
}
});
}
break;
default:
}
}
在他基于的Activity中需要重写onRequestPermissionsResult(解决回调不成功的问题)
// Activity中
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 获取到Activity下的Fragment
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments == null)
{
return;
}
// 查找在Fragment中onRequestPermissionsResult方法并调用
for (Fragment fragment : fragments)
{
if (fragment != null)
{
// 这里就会调用我们Fragment中的onRequestPermissionsResult方法
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
关于权限问题,第一次拒绝,没有勾选记住我的选择,或者勾选,或者允许权限,比较复杂麻烦的判断可以尝试shouldShowRequestPermissionRationale:
- 第一次打开App时:false
- 上次弹出权限点击了禁止(但没有勾选“下次不在询问”):true
- 上次选择禁止并勾选:下次不在询问 : false