android實現(xiàn)掃描網(wǎng)頁二維碼進行網(wǎng)頁登錄功能
先說一下實現(xiàn)了什么效果,app掃描php寫的頁面(也可以java網(wǎng)頁,都一樣的思路和步驟),掃描成功后跳轉(zhuǎn)進入主頁,光和你們這么說,肯定有人說了,沒圖說個jb,這就出來一個問題,很多人寫博客,看這標題特別符合自己的問題,然后興致勃勃的進來了,一看,我去...尼瑪全是代碼,也不知道是不是我的那種問題和想要的那種效果,心里沒譜啊,好了,上圖:
別糾結(jié)這頁面咋這么丑,沒寫樣式,說一下我實現(xiàn)的思路哈,首先在數(shù)據(jù)庫中新建一個表用來存儲掃碼登錄信息(id,username,randomnum),這三個分別是id自增長,用戶名,隨機數(shù)——>點擊生成二維碼,生成隨機數(shù),可以用
說的簡單的就是,生成二維碼的時候只存入隨機數(shù)(或者你自定義的隨便信息),使用app掃碼之后根據(jù)隨機數(shù)把用戶名存進去,網(wǎng)頁每隔5s請求另外一個接口時,如果username不為空好了跳轉(zhuǎn)操作。大體就是這樣的,有可能大神的實現(xiàn)也不是這樣的,我就是把我理解的說出來,如果你們有另外的實現(xiàn)方法也可以在下邊評論告訴我,共同學(xué)習(xí),下面貼代碼了。 部分php(新手可能不太規(guī)范,勿噴)login.php代碼: 然后是login.html 上邊就是服務(wù)端的部分代碼,放心有源碼,下邊寫完一起給 下面開始android了關(guān)于android的掃碼第三方開源的有挺多的,這里使用的是Zing,他可以實現(xiàn)的挺多的二維碼,條形碼,生成二維碼。。。 建類庫,導(dǎo)jar包,掉用,你們可以直接拿過這個類庫去,然后自己改需要的樣式。 這個圖是目錄結(jié)構(gòu) 主要的就是mainActivity.java里邊的調(diào)用了 掃碼成功之后的回掉: volleyScanCodeLogin()方法: 上邊那些就是主要的工程代碼,然后源碼我打包放到百度云盤中,鏈接:https://pan.baidu.com/s/1slsQM2D 密碼:gdyp
else if ($_REQUEST['act'] != '' && $_REQUEST['act'] == 'codeCreate') {
//if userName為空--->表示網(wǎng)頁第一次點擊新建生成
//網(wǎng)頁生成二維碼操作,同時添加數(shù)據(jù)到表中
if ($_REQUEST['userName'] != '') {//不為空的時候表示修改
$userName = $_REQUEST['userName'];
$randomNum = $_REQUEST['randomNum'];
echo "掃碼成功";
$sql = "update UserCodeLogin set username='$userName' WHERE randomnum='$randomNum'";
// mysqli_query($conn, $sql);//插入成功
} else {//為空的時候表示是新建二維碼
//生成隨機數(shù)
$randomNum = "";
for ($i = 0; $i < 5; $i++) {
$randomNum .= rand(0, 9);
}
echo $randomNum;//顯示生成的隨機數(shù)
$sql = "insert into UserCodeLogin(username,randomnum) VALUES ('','$randomNum')";
// mysqli_query($conn, $sql);//插入成功
}
mysqli_query($conn, $sql);//插入成功
} else if ($_REQUEST['act'] != '' && $_REQUEST['act'] == 'codeSelect') {//根據(jù)隨機數(shù)查詢表中的username是否為空
$randomNum = $_REQUEST['randomNum'];
if ($randomNum == '' && empty($randomNum)) {
} else if ($randomNum != '') {
$sql = "select username from UserCodeLogin where randomnum='$randomNum'";
$result = mysqli_query($conn, $sql);
// print_r($result);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$userName = $row['username'];
}
if ($userName == '' && $userName == null) {
//說明客戶端還未掃碼修改過
} else if ($userName != '') {
//客戶端掃碼完成
//跳轉(zhuǎn)頁面
echo "客戶端掃碼成功,跳轉(zhuǎn)中...";
}
}
}
<html>
<head>
<title>這是首頁</title>
</head>
<script type="text/javascript" src="js/jquery-1.12.3.js"></script>
<body>
<script type="text/javascript">
var type = 1;
var randomNum;
function clickBtn() {
$.post("../login.php?act=codeCreate&userName=",
function (data) {
alert("-------random:" + data);
randomNum = data;
$("#img").attr('src', "http://qr.topscan.com/api.php?text=" + data);
});
type = 2;
}
function time() {
$.post("../login.php?act=codeSelect&randomNum=" + randomNum,
function (data) {
if (data) {
alert(data);
$(location).attr('href', 'index.html');
} else {
}
})
}
setInterval("time()", 4000);
</script>
<button type="submit" id="btn" onclick="clickBtn()"> 點擊生成二維碼</button>
<!--src="https://www.baidu.com/img/baidu_jgylogo3.gif"-->
<img id="img" style="visibility: visible" width="250px"/>
</body>
</html>
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 掃描二維碼/條碼回傳
if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
if (data != null) {
String content = data.getStringExtra(Constant.CODED_CONTENT);
result.setText("掃描結(jié)果為:" + content);
/*執(zhí)行網(wǎng)絡(luò)請求*/
String username = "dingchao";
volleyScanCodeLogin(content, username);
Log.e("aaa","volleyScanCodeLogin。。。3");
}
}
}
/**
* 網(wǎng)絡(luò)請求
* 使用Volley進行網(wǎng)絡(luò)請求
*
* @param content 攜帶的隨機數(shù)和用戶名
* @param username 用戶名
*/
private void volleyScanCodeLogin(final String content, final String username) {
Log.e("aaa","volleyScanCodeLogin。。。1");
final RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://你自己的目錄地址/webcodelogin/login.php", new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.e("aaa","volleyScanCodeLogin。。。2");
Toast.makeText(MainActivity.this, "" + s, Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("act", "codeCreate");
map.put("userName", username);
map.put("randomNum", content);
return map;
}
};
mQueue.add(stringRequest);/*請求數(shù)據(jù)*/
}
相關(guān)文章
Android?Settings?跳轉(zhuǎn)流程方法詳解
這篇文章主要為大家介紹了Android?Settings跳轉(zhuǎn)流程方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07Android 調(diào)用系統(tǒng)應(yīng)用的方法總結(jié)
這篇文章主要介紹了Android 調(diào)用系統(tǒng)應(yīng)用的方法總結(jié)的相關(guān)資料,這里提供調(diào)用錄像,錄音,拍照等功能,需要的朋友可以參考下2017-08-08RecyclerView焦點跳轉(zhuǎn)BUG優(yōu)化的方法
這篇文章主要介紹了RecyclerView焦點跳轉(zhuǎn)BUG優(yōu)化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗
這篇文章主要為大家詳細介紹了android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12Android中的windowSoftInputMode屬性詳解
這篇文章主要介紹了Android中的windowSoftInputMode屬性詳解,本文對windowSoftInputMode的9個屬性做了詳細總結(jié),需要的朋友可以參考下2014-10-10Android 實現(xiàn)左滑出現(xiàn)刪除選項
滑動刪除的部分主要包含兩個部分, 一個是內(nèi)容區(qū)域(用于放置正常顯示的view),另一個是操作區(qū)域(用于放置刪除按鈕)。下面通過本文給大家介紹Android 實現(xiàn)左滑出現(xiàn)刪除選項,需要的朋友可以參考下2017-06-06Android 跨進程模擬按鍵(KeyEvent )實例詳解
這篇文章主要介紹了Android 跨進程模擬按鍵(KeyEvent )實例詳解的相關(guān)資料,類似手機遙控器的需求就可以這么做,需要的朋友可以參考下2016-11-11Android 實現(xiàn)通知消息水平播放、無限循環(huán)效果
Android 實現(xiàn)通知消息水平播放、無限循環(huán)效果非常常見,今天小編給大家分享實例代碼感興趣的朋友參考下吧2017-08-08