安卓通过浏览器打开本地APP指定页面,以及APP内Webview起调native,以及webview设置cookies相关

这个功能其实做了有一段时间了,一直想写点东西,又总是写一半又放下。趁着年前的时间还是多多少少的总结一点把。

最初做手机浏览器起调native APP的指定页面的功能,这个功能也查了很多的资料,但是估计是搜索关键字不对,当时也没查到完整的解决方案,甚至这个写的挺完善的文章 都没看到,导致我这篇文章跟他的雷同的好多。

跟他测试的一样,uc打不开,自己测试的几个QQ浏览器,手机自带的浏览器是可以的。

具体参考如下,H5部分


androidjumpurl='com.packagename.XXX://?params={"type":"'+type+'","value":"'+value+'"}';

var ifr = document.createElement('iframe');

ifr.src = androidjumpurl;

ifr.style.display = 'none';

document.body.appendChild(ifr);

window.setTimeout(function(){

showdownload();document.body.removeChild(ifr);

},2000)

H5这边比较简单,设置一个 androidjumpurl(名字随意)的链接,前面的是你的包名 ,pamras字段里写一段json数据,起调本地页面之后的可以带过去数据,当然也可以传空。2S后,网页弹出下载框,可以调用下载的方法进行下载app(成功调起app的话,就会进入app)。

之后,就是安卓部分的设置了,首先是需要app的入口,这里我用的是mainactivity,因为考虑到启动指定页面后需要有返回的操作,当然也自己随意写


<mainactivity>

<intent-filter>

<action android:name="android.intent.action.VIEW"/>

<category android:name="android.intent.category.DEFAULT"/>

<category android:name="android.intent.category.BROWSABLE"/>

<data

android:pathPrefix="/"

android:scheme="com.packagename.XXX"/>

</mainactivity>

之后是在activity中接收这个数据,然后拿到数据后解析json,之后再根据json的类型进行跳转。接收的activity就不用再贴出来了吧,就是个intent跳转。


Uri uridata = getIntent().getData();

if(uridata !=null&& !TextUtils.isEmpty(uridata.toString())) {

String id = uridata.getQueryParameter("type");

if(!TextUtils.isEmpty("id")) {

try{

JSONObject jsob =newJSONObject(id);

String value = jsob.optString("value");

if(!TextUtils.isEmpty("type")) {

if(value.equals("activity1")) {

intent2Activyty(1,value);//传递参数进去

}else if(des.equals("activity1")) {

intent2Activyty(2,value);

}else{

return;

}

}

}

}catch(JSONException e) {

e.printStackTrace();

return;

}

}

}

}

之后是关于本地webview中h5和native联动的一些简单实现。其事就是webview的H5启动本地页面

        webView = (WebView) findViewById(R.id.mywebview);
        //设置WebView属性,能够执行Javascript脚本
        webView.getSettings().setJavaScriptEnabled(true);
// 其作用的代码如下
        //加载需要显示的网页
        webView.loadUrl(url);
        //设置浏览器
web_push.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.startsWith("http://www.XXX.com/open?")) {
                    //  比如链接是一个 http://www.XXX.com/open?id=1&key=1
                    //之后有了链接操作就简单了,比如直接替换分割拿到数据
                    String replace = url.replace("http://www.XXX.com/open?", "");
                    String[] split= replace.split("=");
                  //根据这个split[0] split[2]可以进行相关操作了
////////////////////特别的,提供一个webview使用整个APP网络访问持有的cookies的方式
setcookies(this,url);
////////////////////
                    return true;
                } else {
                    MyApp.setWebViewCookie(H5WebviewActivity.this, url);
                }
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

由于项目要求网络访问都持有同样的cookies访问,我项目使用的是okhttp+glide 所以就采用了glide走okhttp方式来使用同一套cookies。
可以参考 compile 'com.github.franmontiel:PersistentCookieJar:v0.9.3' 来使用
1.MyApp extends Appcation
2.getCookieJar() 即获得整个app使用的cookies

public static void setWebViewCookie(Context context, String url) {
        CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
//      cookieManager.removeSessionCookie();// 移除
        cookieManager.removeAllCookie();   
        List<Cookie> cookies = MyApp.getApp().getCookieJar().loadForRequest(HttpUrl.parse(url));

        StringBuffer sb = new StringBuffer();
        for (Cookie cookie : cookies) {
            String cookieName = cookie.name();
            String cookieValue = cookie.value();
            if (!TextUtils.isEmpty(cookieName)
                    && !TextUtils.isEmpty(cookieValue)) {
                sb.append(cookieName + "=");
                sb.append(cookieValue + ";");
            }
        }
        String[] cookie = sb.toString().split(";");
        for (int i = 0; i < cookie.length; i++) {
            cookieManager.setCookie(url, cookie[i]);// cookies是在HttpClient中获得的cookie
        }
        CookieSyncManager.getInstance().sync();
    }

基本上算是想到哪写哪,本来只是想写浏览器启动本地APP的,然后想起webview相关,加上牵扯到cookies的一些东西,就一并写上。其实也不算难,都是些很基础的东西。只是当时项目用到时候找了好久的也没找到的东西,作为一个记录放在这里吧,省的以后再用找不到。也欢迎拍砖或者提供更好的思路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容