由于要用到js与android交互,先写一下交互的心得:

具体js与android的交互可以查看 http://blog.csdn.net/carson_ho/article/details/64904691,感觉介绍的很详细。

效果图如下:

android webview中js交互、第三方分享。_第1张图片

1.android调用js中的callJS()方法。

     方法一:mWebView.loadUrl("javascript:callJS()");//效率低
方法二:mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback() {        @Override        public void onReceiveValue(String value) {            //此处为 js 返回的结果        }    });//效率高,仅4.4以上可用。

2.js调用android中的方法。

1. 通过WebView的addJavascriptInterface()进行对象映射 2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url 3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

3.调用android中的方法。我采用的是第一种方法:addJavascriptInterface()

定义JSJavaSprict对象,传递JsInterface(接口中将以后要回调的方法定义好,用的时候实现对应的方法)

(回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦他的本质是基于观察者设计模式,即观察者设计模式的的简化版)
// 通过addJavascriptInterface()将Java对象映射到JS对象 //参数1:Javascript对象名//参数2:Java对象名
 mWebView.addJavascriptInterface(new JSJavaSprict(new JsInterface() {
            @Override            public void starShare(final String shareUrl, final String title, final String thumb, final String disgest) {                ShareDialog shareDialog = new ShareDialog(PolicyDetailsActivity.this, new ShareDialog.ShareClickListen() {                    @Override                    public void WXFriend() {                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                shareWeixin(0, shareUrl, title, disgest);                            }                        });                    }                    @Override                    public void WXContacts() {                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                shareWeixin(1, shareUrl, title, disgest);                            }                        });                    }                    @Override                    public void QQQzone() {                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                shareToQzone(title, disgest, thumb, shareUrl);                            }                        });                    }                    @Override                    public void QQContacts() {                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                sendQQ(title, disgest, shareUrl, thumb);                            }                        });                    }                    @Override                    public void WB() {                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                sendMultiMessage(title, shareUrl, disgest);                            }                        });                    }                    @Override                    public void copy() {                        //复制链接                        ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);                        // 将文本内容放到系统剪贴板里。                        cm.setText(shareUrl);                        ToastUtils.showShortToast("复制成功!");                    }                });                shareDialog.show();            }            @Override            public void setTitle(String title) {            }            @Override            public void toActivity() {            }            @Override            public void finish() {//                PolicyDetailsActivity.this.finish();            }            @Override            public void download(String url) {                if (SDCardUtils.isSDCardEnable()) {                    String[] split = url.split("/");                    //文件名字                    String fileName = split[split.length - 1];                    RequestParams entity = new RequestParams(url);                    // 设置断点续传                    entity.setAutoResume(true);                    entity.setSaveFilePath(Contasts.DIR_FILE + "/" + fileName);                    x.http().get(                            entity, new Callback.ProgressCallback() {                                @Override                                public void onSuccess(File result) {                                    ToastUtils.showShortToast("下载成功");                                    loadingProgress.dismissDialog();                                    try {                                        Intent intent = new Intent();                                        intent.setAction(Intent.ACTION_VIEW);                                        intent.setDataAndType(Uri.fromFile(result), getMIMEType(result));                                        startActivity(intent);                                    } catch (Exception e) {                                        ToastUtils.showShortToast("请安装相关插件");                                    }                                }                                @Override                                public void onError(Throwable ex, boolean isOnCallback) {                                }                                @Override                                public void onCancelled(CancelledException cex) {                                }                                @Override                                public void onFinished() {                                }                                @Override                                public void onWaiting() {                                    loadingProgress = new LoadingProgress(PolicyDetailsActivity.this);                                    loadingProgress.showDialog("正在下载中...");                                }                                @Override                                public void onStarted() {                                }                                @Override                                public void onLoading(long total, long current, boolean isDownloading) {                                }                            });                } else {                    ToastUtils.showShortToast("SD卡不可用");                }            }        }), "android");
4、JSJavaSprict和JsInterface写法
import android.webkit.JavascriptInterface;public class JSJavaSprict {    private JsInterface jsInterface;    public JSJavaSprict(JsInterface jsInterface) {        this.jsInterface = jsInterface;    }    //windows.android.startShare('1223')    // 被JS调用的方法必须加入@JavascriptInterface注解    @JavascriptInterface    public void startShare(String shareUrl, String title, String thumb, String disgest) {        jsInterface.starShare(shareUrl, title, thumb, disgest);    }    //windows.android.setTitle('1223')    @JavascriptInterface    public void setTitle(String msg) {        jsInterface.setTitle(msg);    }    @JavascriptInterface    public void startSign(String type) {        //  LogUtils.d(type);        if ("2".equals(type)) {            jsInterface.toActivity();        } else {            jsInterface.finish();        }    }    /**     * 下载文件     *     * @param url     */    @JavascriptInterface    public void startdownload(String url) {        jsInterface.download(url);    }}
public interface JsInterface {    /**     * 地址 标题 缩略图 摘要     *     * @param shareUrl     * @param title     * @param thumb     * @param disgest     */    void starShare(String shareUrl, String title, String thumb, String disgest);    void setTitle(String title);    void toActivity();    void finish();    void download(String url);}
弹出分享框。
public class ShareDialog extends Dialog {    private GridView gvItem;    private TextView tvCancel;    private Context mContext;    private List mlist;    private ShareClickListen shareClickListen;    public ShareDialog(@NonNull Context context, ShareClickListen shareClickListen) {        super(context);        this.mContext = context;        this.shareClickListen = shareClickListen;        mlist = new ArrayList<>();        for (int i = 0; i < 6; i++) {            mlist.add(i);        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        getWindow().setBackgroundDrawableResource(R.drawable.loc_background);        getWindow().setWindowAnimations(R.style.dialogstyle);        getWindow().getDecorView().setPadding(0, 0, 0, 0);        WindowManager.LayoutParams params = getWindow().getAttributes();        params.width = WindowManager.LayoutParams.FILL_PARENT;        params.height = WindowManager.LayoutParams.WRAP_CONTENT;        getWindow().setAttributes(params);        getWindow().setGravity(Gravity.BOTTOM);        setContentView(R.layout.dialog_share);        gvItem = findViewById(R.id.gv_item);        tvCancel = findViewById(R.id.tv_cancel);        gvItem.setAdapter(new CommonAdapter(mContext, mlist, R.layout.item_dialog_share) {            @Override            public void convert(ViewHolder helper, Integer item) {                ImageView ivIcon = helper.getView(R.id.iv_icon);                TextView tvIcon = helper.getView(R.id.tv_icon);                switch (item) {                    case 0:                        ivIcon.setImageResource(R.drawable.btn_friends);                        tvIcon.setText("朋友圈");                        break;                    case 1:                        ivIcon.setImageResource(R.drawable.btn_wx);                        tvIcon.setText("微信好友");                        break;                    case 2:                        ivIcon.setImageResource(R.drawable.btn_space);                        tvIcon.setText("QQ空间");                        break;                    case 3:                        ivIcon.setImageResource(R.drawable.btn_qq);                        tvIcon.setText("QQ好友");                        break;                    case 4:                        ivIcon.setImageResource(R.drawable.btn_wb);                        tvIcon.setText("微博");                        break;                    case 5:                        ivIcon.setImageResource(R.drawable.btn_link);                        tvIcon.setText("复制链接");                        break;                }            }        });        gvItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                switch (position) {                    case 0:                        shareClickListen.WXFriend();                        break;                    case 1:                        shareClickListen.WXContacts();                        break;                    case 2:                        shareClickListen.QQQzone();                        break;                    case 3:                        shareClickListen.QQContacts();                        break;                    case 4:                        shareClickListen.WB();                        break;                    case 5:                        shareClickListen.copy();                        break;                }//                sendMultiMessage();            }        });        tvCancel.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                dismiss();            }        });    }    public interface ShareClickListen {        void WXFriend();        void WXContacts();        void QQQzone();        void QQContacts();        void WB();        void copy();    }}

4.当我们点击js中分享按钮时,调用startShare()方法。

点击下载时,调用download()方法。

5.第三方分享。

初始化微博、腾讯、微信方法。将平台申请的key值替换。

        AuthInfo mAuthInfo = new AuthInfo(this, Contasts.APP_KEY, Contasts.REDIRECT_URL, Contasts.SCOPE);//微博        WbSdk.install(this, mAuthInfo);
      WbShareHandler wbShareHandler = new WbShareHandler((Activity) this);
wbShareHandler.registerApp(); wbShareHandler.setProgressColor(0xff33b5e5);
IWXAPI iwxapi = WXAPIFactory.createWXAPI(this, Contasts.WX_APP_KEY, true);//微信 iwxapi.registerApp(Contasts.WX_APP_KEY); // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。 // 其中APP_ID是分配给第三方应用的appid,类型为String。
     Tencent mTencent = Tencent.createInstance(Contasts.QQ_APP_ID, this.getApplicationContext());//腾讯
StatConfig.setDebugEnable(true);

①微信分享

 public void shareWeixin(int type, String shareUrl, String title, String disgest) {        WXWebpageObject wxWebpageObject = new WXWebpageObject();        wxWebpageObject.webpageUrl = shareUrl;        WXMediaMessage msg = new WXMediaMessage();        msg.title = title;        msg.description = disgest;        msg.mediaObject = wxWebpageObject;        //  Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.mipmap.icon_touxiang);//        Bitmap thumbBmp = Bitmap.createScaledBitmap(thumb, THUMB_SIZE, THUMB_SIZE, true);//        thumb.recycle();//        msg.thumbData = Utils.bmpToByteArray(thumb, true);        SendMessageToWX.Req req = new SendMessageToWX.Req();        req.transaction = "windomZZ";        req.message = msg;        if (type == 0) {            req.scene = SendMessageToWX.Req.WXSceneTimeline;        } else {            req.scene = SendMessageToWX.Req.WXSceneSession;        }        iwxapi.sendReq(req);    }

②微博分享

 /**     * 第三方应用发送请求消息到微博,唤起微博分享界面。     *     * @param title     * @param shareUrl     * @param disgest     */    private void sendMultiMessage(String title, String shareUrl, String disgest) {        WeiboMultiMessage weiboMessage = new WeiboMultiMessage();        WebpageObject mediaObject = new WebpageObject();        mediaObject.identify = Utility.generateGUID();        mediaObject.title = title;        mediaObject.description = disgest;        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);        // 设置 Bitmap 类型的图片到视频对象里         设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。        mediaObject.setThumbImage(bitmap);        mediaObject.actionUrl = shareUrl;        mediaObject.defaultText = title;        weiboMessage.mediaObject = mediaObject;        wbShareHandler.shareMessage(weiboMessage, false);    }

在分享的界面实现WbShareCallback

 @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        wbShareHandler.doResultIntent(intent, this);    }    @Override    public void onWbShareSuccess() {        ToastUtils.showShortToast("分享成功");    }    @Override    public void onWbShareCancel() {        ToastUtils.showShortToast("分享取消");    }    @Override    public void onWbShareFail() {    }

③QQ好友及QQ空间分享

private void sendQQ(String title, String digest, String shareUrl, String thumb) {        final Bundle params = new Bundle();        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);        params.putString(QQShare.SHARE_TO_QQ_TITLE, title);        params.putString(QQShare.SHARE_TO_QQ_SUMMARY, digest);        params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareUrl);        params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, thumb);        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "智汇郑州");//        params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, 1);        mTencent.shareToQQ(PolicyDetailsActivity.this, params, this);    }    private void shareToQzone(String title, String digest, String thumb, String shareUrl) {        //分享类型        final Bundle params = new Bundle();        params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);        params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title);//必填        params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, thumb);//选填        params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, shareUrl);//必填        ArrayList mlist = new ArrayList<>();        mlist.add(thumb);        params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, mlist);        mTencent.shareToQzone(PolicyDetailsActivity.this, params, this);    }
当前activity实现IUiListener接口
 @Override    public void onComplete(Object o) {        ToastUtils.showShortToast("分享成功");    }    @Override    public void onError(UiError uiError) {        switch (uiError.errorCode) {        }    }    @Override    public void onCancel() {        ToastUtils.showShortToast("分享取消");    }    //分享回调    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        Tencent.handleResultData(data, this);    }








更多相关文章

  1. Android 中Popwindow弹出菜单的两种方法实例
  2. Android中线程的使用方法
  3. android设备adb usb驱动安装方法
  4. Android学习-RelativeLayout相对布局属性方法
  5. framework的调试与编译方法
  6. android studio 更新 Gradle错误解决方法
  7. android EditText控件自动获取焦点弹出键盘解决方法
  8. Android获取当前已连接的wifi信号强度的方法

随机推荐

  1. Android5.0网络子系统
  2. android 获取系统中各种类型音量及对音量
  3. Android中的事件分发传递机制
  4. android recovery 系统代码分析【精】
  5. Android GridView使用注意的问题
  6. ANR超时时间的定义 .
  7. android建立NDK项目调用jrtplib与pc机进
  8. Android多文件断点续传(三)——实现文件断
  9. Android更新Ui线程的四个方法
  10. [置顶] Android 无需root实现apk的静默安