错误信息:java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{765d76f 31960:com.re.mywebview/u0a265} (pid=31960, uid=10265) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
程序目的:在JS中调用Android的接口方法,简单读取联系人信息并显示在html页面中。
AndroidManifest.xml文件已经加入了权限:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
修改几处:
1、targetSdkVersion 27,经查找资料发现,23以上的版本读取联系人均会出现以上错误,修改为22或者22以下。
2、传递给js调用的业务类中的方法提取到一个线程中使用,如:
public class SharpJS { @JavascriptInterface public void contactlist() { handler.post(new Runnable() { //add @Override public void run() {
//method add try { System.out.println("contactlist()方法执行了!"); String json = buildJson(getContacts()); wView.loadUrl("javascript:show('" + json + "')"); } catch (Exception e) { Log.e("error:",e.getMessage()); }
//method end } }); } @JavascriptInterface public void call(final String phone) { handler.post(new Runnable() { @Override public void run() { System.out.println("call()方法执行了!"); Intent it = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone)); try { startActivity(it); } catch (Exception e) { e.printStackTrace(); } } }); } }如果不在同一线程中调用方法,会报如下错误:
WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {10ec681} called on Looper (JavaBridge, tid 10834) {4483fc6}, FYI main Looper is Looper (main, tid 1) {10ec681}
以上也是查询资料并实际操作所得,仅供参考。