基於html5 plusjavascript
http://www.html5plus.org/doc/zh_cn/audio.htmlcss
栗子:html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Barcode Example</title> <script type="text/javascript" > // 擴展API加載完畢後調用onPlusReady回調函數 document.addEventListener( "plusready", onPlusReady, false ); // 擴展API加載完畢,如今能夠正常調用擴展API function onPlusReady() { var e = document.getElementById("scan"); e.removeAttribute( "disabled" ); } var scan = null; function onmarked( type, result ) { var text = '未知: '; switch(type){ case plus.barcode.QR: text = 'QR: '; break; case plus.barcode.EAN13: text = 'EAN13: '; break; case plus.barcode.EAN8: text = 'EAN8: '; break; } alert( text+result ); } function startRecognize() { scan = new plus.barcode.Barcode('bcid'); scan.onmarked = onmarked; } function startScan() { scan.start(); } function cancelScan() { scan.cancel(); } function setFlash() { scan.setFlash(); } </script> <style type="text/css"> *{ -webkit-user-select: none; } html,body{ margin: 0px; padding: 0px; height: 100%; } #bcid { background:#0F0; height:480px; width:360px; } </style> </head> <body > <input type='button' onclick='startRecognize()' value='建立掃碼控件' /> <input type='button' onclick='startScan()' value='開始掃碼' /> <input type='button' onclick='cancelScan()' value='取消掃碼' /> <input type='button' onclick='setFlash()' value='開啓閃光燈' /> <div id= "bcid"></div> <input type='text' id='text'/> </body> </html>
自定義:html5
scanQR.HTMLjava
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" type="text/css" href="css/mui.css"/> </head> <body> <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a> <h1 class="mui-title">掃描玩具二維碼</h1> </header> <div class="mui-content"> <div id="bcid" style="width: 100%;height: 750px;"></div> </div> <script src="js/mui.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> mui.init(); var scan = null; mui.plusReady(function () { scan = new plus.barcode.Barcode("bcid"); scan.onmarked = inmarked; #識別二維碼 scan.start(); #開啓識別掃描 inmarked(0,"d602f74c6a60fc1e9f60b20a190eeed7"); #在不開啓攝像頭的狀況下,掃描二維碼的是內容存儲的內容 }) function inmarked(type,code){ // alert(type +":"+ code) mui.post(window.serv+ '/validate_code',{ device_key:code #{"device_key":"1eae197f4f4abe105c40bcaa7438d1f2"}, },function(data){ if(data.code == 0){ //打開綁定玩具流程 建立玩具 mui.openWindow({ url:"bind_toy.html", id:"bind_toy.html", extras:data.data # 獲取的數據 {"code":0,"data":{"device_key":"1eae197f4f4abe105c40bcaa7438d1f2"},"msg":"設備已受權,開啓綁定"} }) }else if(data.code==2){ //掃描的二維碼信息異常 mui.toast(data.msg); mui.back(); }else if(data.code==1){ //神祕代碼 } },'json' ); } </script> </body> </html>
在上一步掃碼後,進入玩具的綁定界面web
bind_toy.htmljson
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" type="text/css" href="css/mui.css" /> </head> <body> <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a> <h1 class="mui-title">綁定玩具</h1> </header> <div class="mui-content"> <form class="mui-input-group"> <div class="mui-input-row"> <label>玩具名稱</label> <input type="text" id="toy_name" class="mui-input-clear" placeholder="給玩具取個名字"> </div> <div class="mui-input-row"> <label>寶寶名稱</label> <input type="text" id="baby_name" class="mui-input-clear" placeholder="玩具小主人的名字"> </div> <div class="mui-input-row"> <label>對您的稱呼</label> <input type="text" id="remark" class="mui-input-clear" placeholder="小主人對您的稱呼"> </div> <div class="mui-button-row"> <button type="button" class="mui-btn mui-btn-primary" id='bind_btn'>綁定</button> <button type="button" class="mui-btn mui-btn-red mui-action-back">取消</button> </div> </form> </div> </body> <script src="js/mui.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> mui.init(); var Sdata = null; mui.plusReady(function() { Sdata = plus.webview.currentWebview();#獲取到掃描到數據 }) document.getElementById('bind_btn').addEventListener('tap', function() { mui.post(window.serv + '/bind_toy', { //1.device_key device_key: Sdata.device_key,{"device_key":"1eae197f4f4abe105c40bcaa7438d1f2"}, //2.formdata toy_name: document.getElementById("toy_name").value, baby_name: document.getElementById("baby_name").value, remark: document.getElementById("remark").value, //3.user_id user_id: window.localStorage.getItem("user") }, function(data) { if(data.code == 0) { mui.openWindow({ url: "toy_manager.html", id: "toy_manager.html", createNew:true #刷新頁面 }) } }, 'json'); }) </script> </html>
後端存儲數據後端
@devices.route("/bind_toy",methods=['POST']) def bind_toy(): # 1.device_key 2.fromdata 3. who bind toy toy_info = request.form.to_dict() print(toy_info) chat_window = MongoDB.chats.insert_one({"user_list":[],"char_list":[]}) user_info = MongoDB.xujian.find_one({"_id":ObjectId(toy_info["user_id"])}) toy_info["bind_user"] = toy_info.pop("user_id") toy_info["avatar"] = "toy.jpg" toy_info["firend_list"] = [ { "firend_id":toy_info["bind_user"], "firend_name":user_info.get("nickname"), "firend_nick":toy_info.pop("remark"), "firend_avatar":user_info.get("avatar"), "firend_type":"app", "firend_chat":str(chat_window.inserted_id) } ] toy = MongoDB.toys.insert_one(toy_info) user_info["bind_boy"].append(str(toy.inserted_id)) user_add_toy={ "firend_id": str(toy.inserted_id), "firend_name": toy_info.get("toy_name"), "firend_nick": toy_info.get("baby_name"), "firend_avatar": toy_info.get("avatar"), "firend_type": "toy", "firend_chat": str(chat_window.inserted_id) } user_info["friend_list"].append(user_add_toy) MongoDB.xujian.update_one({"_id":ObjectId(toy_info["bind_user"])}, {"$set":user_info}) MongoDB.chats.update_one({"_id":chat_window.inserted_id},{"$set":{"user_list":[ str(toy.inserted_id),str(user_info.get("_id")) ]}}) RET["code"] = 0 RET["msg"] = "綁定玩具成功" RET['data'] = {} return jsonify(RET)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" type="text/css" href="css/mui.css" /> </head> <body> <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a> <h1 class="mui-title">管理個人玩具</h1> </header> <div class="mui-content"> <ul class="mui-table-view" id="toy_list"> <li class="mui-table-view-cell mui-media"> <a id="add_bind"> <img class="mui-media-object mui-pull-left" src="image/add.jpg"> <div class="mui-media-body"> 添加綁定玩具 <p class="mui-ellipsis">點擊此處開始掃描玩具二維碼</p> </div> </a> </li> </ul> </div> </body> <script src="js/mui.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> mui.init(); mui.plusReady(function () { mui.post(window.serv + '/toy_list',{ #經過post請求返回掌控的機器人 user_id:window.localStorage.getItem("user")#發送user 信息 },function(data){ console.log(JSON.stringify(data)); for (var i = 0; i < data.data.length; i++) { create_item(data.data[i]); } },'json' ); }) document.getElementById('add_bind').addEventListener('tap', function() { mui.openWindow({ url: "scanQR.html", id: "scanQR.html", }) }) function create_item(content) { var li = document.createElement("li"); li.className = "mui-table-view-cell mui-media"; var a = document.createElement("a"); a.onclick = function() { } var img = document.createElement("img"); img.className = "mui-media-object mui-pull-left"; img.src = "avatar/" + content.avatar; var div = document.createElement("div"); div.className = "mui-media-body"; div.innerText = content.baby_name; var p = document.createElement("p"); p.className = "mui-ellipsis"; p.innerText = content.toy_name; li.appendChild(a); a.appendChild(img); a.appendChild(div); div.appendChild(p); document.getElementById("toy_list").appendChild(li); } </script> </html>
這樣,用戶就能夠查看他綁定的機器人啦app
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" type="text/css" href="css/mui.css"/> <link rel="stylesheet" type="text/css" href="css/chat.css" /> </head> <body> <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a> <h1 class="mui-title">xxx話框</h1> </header> <div class="mui-content"> <div class="leftd"> <span class="leftd_h"> <img src="avatar/toy.jpg" /> </span> <div class="left speech"> 點擊播放消息 </div> </div> <div class="rightd"> <span class="rightd_h"> <img src="avatar/toy.jpg" /> </span> <div class="right speech"> 點擊播放消息 </div> </div> <nav class="mui-bar mui-bar-tab"> <a class="mui-tab-item mui-active" id="talk"> <span class="mui-icon mui-icon-speech"></span> <span class="mui-tab-label">按住說話</span> </a> </nav> </div> </body> <script src="js/mui.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> mui.init({ gestureConfig: { doubletap: false, //默認爲false longtap: false, //默認爲false swipe: false, //默認爲true drag: false, //默認爲true hold: true, //默認爲false,不監聽 release: true //默認爲false,不監聽 } }); var reco =null mui.plusReady(function () { }) //void recorder.record( option, successCB, errorCB ); // 錄音操做 //var r = plus.audio.getRecorder(); //r.record( {filename:"_doc/audio/"}, function () { // alert( "Audio record success!" ); //}, function ( e ) { // alert( "Audio record failed: " + e.message ); //} ); document.getElementById('talk').addEventListener('hold',function () { #在按住的時候經過audio調用麥克風監聽語音 reco = plus.audio.getRecorder(); reco.record({ filename: "_doc/audio/", #filename 文件路徑 format: "amr" #format 文件類型 }, function(path) { console.log(path); createUpload(path); #path 文件存儲路徑 }); }) document.getElementById('talk').addEventListener('release',function () { #離開時中止錄製 reco.stop(); }) function createUpload(path) { var task = plus.uploader.createUpload(window.serv + "/uploader", { method: "POST" }, function(t, status) { // 上傳完成 if(status == 200) { alert("Upload success: " + t.url); } else { alert("Upload failed: " + status); } } ); task.addFile(path, { #上傳文件 key: "recorder" }); task.addData("key", "value"); $附上日期 task.start(); } </script> </html>
後端生成對話文件ide
@gsa.route("/uploader",methods=["POST"]) def uploader(): audio = request.files.get("recorder") path = os.path.join(chats_path,audio.filename) audio.save(path) os.system(f"ffmpeg -i {path} {path}.mp3") #經過ffmpeg強制轉變格式 return "123"