wpadebug: Add support for QR Code scanning and display via zxing
Enhance wpadebug application to support scanning and displaying of QR codes. This depends on a third-party source: zxing (https://github.com/zxing/zxing). Shell command to launch scanner/viewer via wpadebug is: >adb root >adb shell Scanner: >am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeScannerActivity Viewer: >am start -n w1.fi.wpadebug/w1.fi.wpadebug.QrCodeDisplayActivity QR code string input/output file would be generated in '/sdcard/wpadebug_qrdata.txt' in the device. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
8f7a50a63e
commit
717f236dce
5 changed files with 219 additions and 0 deletions
|
@ -8,6 +8,7 @@
|
|||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<application android:label="wpadebug">
|
||||
<activity android:name="w1.fi.wpadebug.MainActivity"
|
||||
android:label="wpadebug">
|
||||
|
@ -45,6 +46,14 @@
|
|||
android:label="Credential"
|
||||
android:parentActivityName="w1.fi.wpadebug.WpaCredActivity">
|
||||
</activity>
|
||||
<activity android:name="w1.fi.wpadebug.QrCodeScannerActivity"
|
||||
android:label="QR Code Reader"
|
||||
android:parentActivityName="w1.fi.wpadebug.MainActivity">
|
||||
</activity>
|
||||
<activity android:name="w1.fi.wpadebug.QrCodeDisplayActivity"
|
||||
android:label="QR Code Display"
|
||||
android:parentActivityName="w1.fi.wpadebug.MainActivity">
|
||||
</activity>
|
||||
<activity android:name="w1.fi.wpadebug.WpaWebViewActivity"
|
||||
android:label="WebView"
|
||||
android:launchMode="singleTop"
|
||||
|
|
|
@ -20,6 +20,19 @@ Build
|
|||
-----
|
||||
|
||||
- Install Android SDK and build tools
|
||||
|
||||
wpadebug depends on zxing core to launch QR code display/scanning.
|
||||
To build zxing core:
|
||||
|
||||
- mkdir hostap/wpadebug/libs # target for the jar file
|
||||
- Install maven tool
|
||||
- clone latest zxing code [git clone https://github.com/zxing/zxing.git]
|
||||
- cd zxing/core
|
||||
- run: mvn install -DskipTests
|
||||
- copy target/core-*.*.*-SNAPSHOT.jar to hostap/wpadebug/libs
|
||||
|
||||
To build wpadebug application:
|
||||
|
||||
- update project target if desired; for example:
|
||||
android list targets
|
||||
android update project --target 1 --path $PWD
|
||||
|
|
13
wpadebug/res/layout/qrcode.xml
Normal file
13
wpadebug/res/layout/qrcode.xml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/qrCode"
|
||||
android:layout_width="350dp"
|
||||
android:layout_height="350dp"
|
||||
android:layout_marginTop="20dp"
|
||||
/>
|
||||
</LinearLayout>
|
109
wpadebug/src/w1/fi/wpadebug/QrCodeDisplayActivity.java
Normal file
109
wpadebug/src/w1/fi/wpadebug/QrCodeDisplayActivity.java
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* wpadebug - wpa_supplicant and Wi-Fi debugging app for Android
|
||||
* Copyright (c) 2018, The Linux Foundation
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
package w1.fi.wpadebug;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.MultiFormatWriter;
|
||||
import com.google.zxing.WriterException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
public class QrCodeDisplayActivity extends Activity {
|
||||
|
||||
private static final String TAG = "wpadebug";
|
||||
private static final String FILE_NAME = "wpadebug_qrdata.txt";
|
||||
private ImageView imageView;
|
||||
|
||||
// Below set of configs are used for QR code display window
|
||||
private final static int WHITE = 0xFFFFFFFF;
|
||||
private final static int BLACK = 0xFF000000;
|
||||
private final static int WIDTH = 400;
|
||||
private final static int HEIGHT = 400;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
// create imageview for this and attach to this activity.
|
||||
setContentView(R.layout.qrcode);
|
||||
imageView = (ImageView) findViewById(R.id.qrCode);
|
||||
String str = readFromFile(FILE_NAME);
|
||||
|
||||
//Encode and launch qrcode now
|
||||
try {
|
||||
Bitmap bitmap = (TextUtils.isEmpty(str)) ? null : encodeAsBitmap(str);
|
||||
if (bitmap != null) {
|
||||
imageView.setImageBitmap(bitmap);
|
||||
} else {
|
||||
Log.e(TAG, "Failed to generate bitmap for uri=" + str);
|
||||
finish();
|
||||
}
|
||||
} catch (WriterException e) {
|
||||
e.printStackTrace();
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
private Bitmap encodeAsBitmap(String str) throws WriterException {
|
||||
BitMatrix result;
|
||||
try {
|
||||
result = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, null);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
// Unsupported format
|
||||
return null;
|
||||
}
|
||||
|
||||
int width = result.getWidth();
|
||||
int height = result.getHeight();
|
||||
int[] pixels = new int[width * height];
|
||||
for (int y = 0; y < height; y++) {
|
||||
int offset = y * width;
|
||||
for (int x = 0; x < width; x++) {
|
||||
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
|
||||
}
|
||||
}
|
||||
|
||||
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
private String readFromFile(String filePath) {
|
||||
try {
|
||||
FileInputStream fis = new FileInputStream(new File("/sdcard", filePath));
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while(( line = br.readLine()) != null ) {
|
||||
sb.append( line );
|
||||
sb.append( '\n' );
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
catch (FileNotFoundException e) {
|
||||
Log.e(TAG, "File not found: " + e.toString());
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Can not read file: " + e.toString());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
75
wpadebug/src/w1/fi/wpadebug/QrCodeScannerActivity.java
Normal file
75
wpadebug/src/w1/fi/wpadebug/QrCodeScannerActivity.java
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* wpadebug - wpa_supplicant and Wi-Fi debugging app for Android
|
||||
* Copyright (c) 2018, The Linux Foundation
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
package w1.fi.wpadebug;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
|
||||
public class QrCodeScannerActivity extends Activity {
|
||||
|
||||
private static final String TAG = "wpadebug";
|
||||
private static final String RESULT = "SCAN_RESULT";
|
||||
private static final String FILE_NAME = "wpadebug_qrdata.txt";
|
||||
private static final String ACTION = "com.google.zxing.client.android.SCAN";
|
||||
|
||||
private static final int QRCODE = 1;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setAction(ACTION);
|
||||
try {
|
||||
startActivityForResult(intent, QRCODE);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Log.e(TAG, "No QR code scanner found with name=" + ACTION);
|
||||
Toast.makeText(QrCodeScannerActivity.this, "QR code scanner not found", Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (requestCode == QRCODE && resultCode == RESULT_OK) {
|
||||
writeToFile(data.getStringExtra(RESULT));
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
public void writeToFile(String data)
|
||||
{
|
||||
File file = new File("/sdcard", FILE_NAME);
|
||||
try
|
||||
{
|
||||
file.createNewFile();
|
||||
FileOutputStream fOut = new FileOutputStream(file);
|
||||
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
|
||||
myOutWriter.append(data);
|
||||
|
||||
myOutWriter.close();
|
||||
|
||||
fOut.flush();
|
||||
fOut.close();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Log.e(TAG, "File write failed: " + e.toString());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue