Javascript | 安卓實(shí)現(xiàn)微信jssdk掃一掃帶參數(shù)的回調(diào)函數(shù)

前言睹簇,最近有個(gè)項(xiàng)目要做一個(gè)安卓和iOS的App,實(shí)質(zhì)上是通過調(diào)用webview來加載網(wǎng)頁膨桥,但是需要實(shí)現(xiàn)微信掃一掃類似的功能钟哥,那就只能通過js來調(diào)用安卓/iOS中暴露出來調(diào)用掃一掃的接口,不過通過搜網(wǎng)上的一些關(guān)于安卓和js互調(diào)的文章达舒,都只是介紹了一些關(guān)于安卓系統(tǒng)和js互調(diào)的基本原理和實(shí)現(xiàn)值朋,并沒有類似于實(shí)現(xiàn)像微信掃一掃一樣的通過回調(diào)函數(shù)來處理微信掃一掃的結(jié)果的相關(guān)教程。那么咱們就得自力更生巩搏,來研究下怎樣才能實(shí)現(xiàn)微信掃一掃類似的功能昨登。

我們就拿安卓的來說。
第一步:
mainfest.xml中加入網(wǎng)絡(luò)權(quán)限

<uses-permission android:name="android.permission.INTERNET" />  

第二步:
加載本地寫好的html文件(定義好js中提供給android調(diào)用的方法 funFromjs(),和android提供給js調(diào)用的對(duì)象接口fun1FromAndroid(String name)),放在 assets目錄下贯底。

<body>  
    <a>js中調(diào)用本地方法</a>  
    <script>  
      
    function funFromjs(){  
        document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";  
    }  
    var aTag = document.getElementsByTagName('a')[0];  
    aTag.addEventListener('click', function(){  
        //調(diào)用android本地方法  
        myObj.fun1FromAndroid("調(diào)用android本地方法fun1FromAndroid(String name)7崂薄!");  
        return false;  
    }, false);  
    </script>  
    <p></p>  
    <div id="helloweb">   
  
    </div>  
</body>  

第三步:
實(shí)現(xiàn)android工程與js交互的相關(guān)代碼,其中l(wèi)oadUrl()是實(shí)現(xiàn)安卓將js代碼注入到webview里的關(guān)鍵
android代碼:

@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
       super.onCreate(savedInstanceState);  
       setContentView(R.layout.activity_main);  
       //初始化  
       initViews();  
  
       //設(shè)置編碼  
       mWebView.getSettings().setDefaultTextEncodingName("utf-8");  
       //支持js  
       mWebView.getSettings().setJavaScriptEnabled(true);  
       //設(shè)置背景顏色 透明  
       mWebView.setBackgroundColor(Color.argb(0, 0, 0, 0));  
       //設(shè)置本地調(diào)用對(duì)象及其接口  
       mWebView.addJavascriptInterface(new JavaScriptObject(mContext), "myObj");  
       //載入js  
       mWebView.loadUrl("file:///android_asset/test.html");  
         
       //點(diǎn)擊調(diào)用js中方法  
       mBtn1.setOnClickListener(new View.OnClickListener() {  
  
           @Override  
           public void onClick(View v) {  
               mWebView.loadUrl("javascript:funFromjs()");  
               Toast.makeText(mContext, "調(diào)用javascript:funFromjs()", Toast.LENGTH_LONG).show();  
           }  
       });  
   }  

js調(diào)用的android對(duì)象方法定義

public class JavaScriptObject {  
    Context mContxt;  
    @JavascriptInterface //sdk17版本以上加上注解  
    public JavaScriptObject(Context mContxt) {  
        this.mContxt = mContxt;  
    }  
  
    public void fun1FromAndroid(String name) {  
        Toast.makeText(mContxt, name, Toast.LENGTH_LONG).show();  
    }  
  
    public void fun2(String name) {  
        Toast.makeText(mContxt, "調(diào)用fun2:" + name, Toast.LENGTH_SHORT).show();  
    }  
}  

以上代碼借鑒了網(wǎng)友們一些代碼_~
下面開始本文的核心代碼,我們將html的代碼改造下

<body>  
    <a>js中調(diào)用本地方法</a>  
    <script>  
      
    function funFromjs(){  
        document.getElementById("helloweb").innerHTML="HelloWebView,i'm from js";  
    }  
    //先定義一個(gè)scan函數(shù)禽捆,參數(shù)cb
    function scan(cb){
        if(typeof cb == "function"){
            //將cb強(qiáng)制類型轉(zhuǎn)化成字符串類型,cb就是回調(diào)函數(shù)
            cb = String(cb);
        }else{
            cb = String(cb);
        }
        myObj.fun1FromAndroid(cb);
    }
    var aTag = document.getElementsByTagName('a')[0];  
    aTag.addEventListener('click', function(){  
        //調(diào)用android本地方法  
        //下面我們來調(diào)用這個(gè)scan函數(shù)并傳入回調(diào)函數(shù)
        scan(function(str){
             alert(str); 
        });
        return false;  
    }, false);  
    </script>  
    <p></p>  
    <div id="helloweb">   
  
    </div>  
</body>  

//然后再改造安卓的java代碼:

public class JavaScriptObject {  
    Context mContxt;  
    @JavascriptInterface //sdk17版本以上加上注解  
    public JavaScriptObject(Context mContxt) {  
        this.mContxt = mContxt;  
    }  
  
    public void fun1FromAndroid(String name) {  
        //這里將name的數(shù)據(jù)暫存起來笙什,方便loadUrl注入js的時(shí)候調(diào)用,具體的代碼就不展示了
        Toast.makeText(mContxt, name, Toast.LENGTH_LONG).show();  
    }  
  
    public void fun2(String name) {  
        Toast.makeText(mContxt, "調(diào)用fun2:" + name, Toast.LENGTH_SHORT).show();  
    }  
}  

然后是安卓activity里的代碼改造:

@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
       super.onCreate(savedInstanceState);  
       setContentView(R.layout.activity_main);  
       //初始化  
       initViews();  
  
       //設(shè)置編碼  
       mWebView.getSettings().setDefaultTextEncodingName("utf-8");  
       //支持js  
       mWebView.getSettings().setJavaScriptEnabled(true);  
       //設(shè)置背景顏色 透明  
       mWebView.setBackgroundColor(Color.argb(0, 0, 0, 0));  
       //設(shè)置本地調(diào)用對(duì)象及其接口  
       mWebView.addJavascriptInterface(new JavaScriptObject(mContext), "myObj");  
       //載入js  
       mWebView.loadUrl("file:///android_asset/test.html");  
         
       //點(diǎn)擊調(diào)用js中方法  
       mBtn1.setOnClickListener(new View.OnClickListener() {  
  
           @Override  
           public void onClick(View v) {  
               mWebView.loadUrl("javascript:funFromjs()");  
               Toast.makeText(mContext, "調(diào)用javascript:funFromjs()", Toast.LENGTH_LONG).show();  
           }  
       });  
   }  
//我們現(xiàn)在考慮的是掃一掃的功能胚想,需要在另一個(gè)頁面實(shí)現(xiàn)調(diào)用攝像頭琐凭,并讀取到二維碼的信息,并存儲(chǔ)下來浊服,在攝像頭頁面銷毀后淘正,回到上個(gè)頁面
@Override
protected void onResume(Bundle savedInstanceState) {  
      //具體的數(shù)據(jù)代碼就不寫了
      String jsCode;//假設(shè)這個(gè)是webview里傳進(jìn)來回調(diào)函數(shù)的字符串
      String scanResualt;//假設(shè)這個(gè)是掃碼之后的結(jié)果
      mWebView.loadUrl("javascript:var app = "+jsCode+";app(' "+scanResualt+" ');");//解釋:這里將前臺(tái)傳遞回調(diào)函數(shù)字符串賦值給一個(gè)變量app摆马,接著再調(diào)用這個(gè)剛定義的app函數(shù),并將掃碼結(jié)果以參數(shù)形式傳遞給app這個(gè)函數(shù)鸿吆;這樣我們能實(shí)現(xiàn)類似微信掃一掃這樣從html端的js傳遞匿名函數(shù)(帶參數(shù)),并以js傳遞不同的回調(diào)函數(shù)來處理安卓系統(tǒng)返回的字符串
}

結(jié)語:上面的代碼可能不夠嚴(yán)謹(jǐn)囤采,只是提供了這樣的一個(gè)思路,可能還有其他更好的實(shí)現(xiàn)方法惩淳,iOS中webview的實(shí)現(xiàn)方式跟安卓的差不多蕉毯,如果有什么疑問可以留言或者私信。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末思犁,一起剝皮案震驚了整個(gè)濱河市代虾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌激蹲,老刑警劉巖棉磨,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異学辱,居然都是意外死亡乘瓤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門策泣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙傀,“玉大人,你說我怎么就攤上這事萨咕⊥程В” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵危队,是天一觀的道長(zhǎng)聪建。 經(jīng)常有香客問我,道長(zhǎng)茫陆,這世上最難降的妖魔是什么金麸? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮盅弛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叔锐。我一直安慰自己挪鹏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布愉烙。 她就那樣靜靜地躺著讨盒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪步责。 梳的紋絲不亂的頭發(fā)上返顺,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天禀苦,我揣著相機(jī)與錄音,去河邊找鬼遂鹊。 笑死振乏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秉扑。 我是一名探鬼主播慧邮,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼舟陆!你這毒婦竟也來了误澳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤秦躯,失蹤者是張志新(化名)和其女友劉穎忆谓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踱承,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倡缠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勾扭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡琉。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妙色,靈堂內(nèi)的尸體忽然破棺而出桅滋,到底是詐尸還是另有隱情,我是刑警寧澤身辨,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布丐谋,位于F島的核電站,受9級(jí)特大地震影響煌珊,放射性物質(zhì)發(fā)生泄漏号俐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一定庵、第九天 我趴在偏房一處隱蔽的房頂上張望吏饿。 院中可真熱鬧,春花似錦蔬浙、人聲如沸猪落。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笨忌。三九已至,卻和暖如春俱病,著一層夾襖步出監(jiān)牢的瞬間官疲,已是汗流浹背袱结。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留途凫,地道東北人垢夹。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颖榜,于是被迫代替她去往敵國(guó)和親棚饵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容