آموزش خواندن بارکد در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش خواندن بارکد در برنامه نویسی اندروید می پردازیم برای هر بارکد یک result درون خود دارد یعنی هر بارکد می توانید یک url نیز در خود جای دهد و با اسکن آن یک سایت باز شود در ادامه با ما همراه باشید.
ابتدا وارد فایل Build.gradle شده در بخش dependencies خط زیر را اضافه کرده و پروژه را sync کنید.
compile 'com.google.android.gms:play-services-vision:9.6.1'
سپس خط زیر را به AndroidManifest.xml
<meta-data
android:name="com.google.android.gms.vision.DEPENDENCIES"
android:value="barcode"/>
حالا باید دسترسی و Feauture را اضافه کنیم.
<uses-feature
android:name="android.hardware.camera"
android:required="true"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
و کل کد AndroidManifest.xml همانند زیر می شود.
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.truiton.mobile.vision.qrcode"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature
android:name="android.hardware.camera"
android:required="true"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.gms.vision.DEPENDENCIES"
android:value="barcode"/>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
حالا یک فایل به نام activity_main.xml ایجاد کرده و کد زیر را در آن قرار دهید.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/scan_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="Scan Results:"
android:textStyle="bold"/>
<TextView
android:id="@+id/scan_results"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/scan_header"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:layout_marginTop="20dp"
android:text="Take Picture"/>
</RelativeLayout>
حالا یک فایل به نام MainActivity.java ایجاد کرده و کد زیر را در آن قرار دهید.
package ir.programchi;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;
import java.io.File;
import java.io.FileNotFoundException;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "Barcode Scanner API";
private static final int PHOTO_REQUEST = 10;
private TextView scanResults;
private BarcodeDetector detector;
private Uri imageUri;
private static final int REQUEST_WRITE_PERMISSION = 20;
private static final String SAVED_INSTANCE_URI = "uri";
private static final String SAVED_INSTANCE_RESULT = "result";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
scanResults = (TextView) findViewById(R.id.scan_results);
if (savedInstanceState != null) {
imageUri = Uri.parse(savedInstanceState.getString(SAVED_INSTANCE_URI));
scanResults.setText(savedInstanceState.getString(SAVED_INSTANCE_RESULT));
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this, new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION);
}
});
detector = new BarcodeDetector.Builder(getApplicationContext())
.setBarcodeFormats(Barcode.DATA_MATRIX | Barcode.QR_CODE)
.build();
if (!detector.isOperational()) {
scanResults.setText("Could not set up the detector!");
return;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_WRITE_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
takePicture();
} else {
Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST && resultCode == RESULT_OK) {
launchMediaScanIntent();
try {
Bitmap bitmap = decodeBitmapUri(this, imageUri);
if (detector.isOperational() && bitmap != null) {
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<Barcode> barcodes = detector.detect(frame);
for (int index = 0; index < barcodes.size(); index++) {
Barcode code = barcodes.valueAt(index);
scanResults.setText(scanResults.getText() + code.displayValue + "\n");
//Required only if you need to extract the type of barcode
int type = barcodes.valueAt(index).valueFormat;
switch (type) {
case Barcode.CONTACT_INFO:
Log.i(LOG_TAG, code.contactInfo.title);
break;
case Barcode.EMAIL:
Log.i(LOG_TAG, code.email.address);
break;
case Barcode.ISBN:
Log.i(LOG_TAG, code.rawValue);
break;
case Barcode.PHONE:
Log.i(LOG_TAG, code.phone.number);
break;
case Barcode.PRODUCT:
Log.i(LOG_TAG, code.rawValue);
break;
case Barcode.SMS:
Log.i(LOG_TAG, code.sms.message);
break;
case Barcode.TEXT:
Log.i(LOG_TAG, code.rawValue);
break;
case Barcode.URL:
Log.i(LOG_TAG, "url: " + code.url.url);
break;
case Barcode.WIFI:
Log.i(LOG_TAG, code.wifi.ssid);
break;
case Barcode.GEO:
Log.i(LOG_TAG, code.geoPoint.lat + ":" + code.geoPoint.lng);
break;
case Barcode.CALENDAR_EVENT:
Log.i(LOG_TAG, code.calendarEvent.description);
break;
case Barcode.DRIVER_LICENSE:
Log.i(LOG_TAG, code.driverLicense.licenseNumber);
break;
default:
Log.i(LOG_TAG, code.rawValue);
break;
}
}
if (barcodes.size() == 0) {
scanResults.setText("Scan Failed: Found nothing to scan");
}
} else {
scanResults.setText("Could not set up the detector!");
}
} catch (Exception e) {
Toast.makeText(this, "Failed to load Image", Toast.LENGTH_SHORT)
.show();
Log.e(LOG_TAG, e.toString());
}
}
}
private void takePicture() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = new File(Environment.getExternalStorageDirectory(), "picture.jpg");
imageUri = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, PHOTO_REQUEST);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
if (imageUri != null) {
outState.putString(SAVED_INSTANCE_URI, imageUri.toString());
outState.putString(SAVED_INSTANCE_RESULT, scanResults.getText().toString());
}
super.onSaveInstanceState(outState);
}
private void launchMediaScanIntent() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(imageUri);
this.sendBroadcast(mediaScanIntent);
}
private Bitmap decodeBitmapUri(Context ctx, Uri uri) throws FileNotFoundException {
int targetW = 600;
int targetH = 600;
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(ctx.getContentResolver().openInputStream(uri), null, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
int scaleFactor = Math.min(photoW / targetW, photoH / targetH);
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
return BitmapFactory.decodeStream(ctx.getContentResolver()
.openInputStream(uri), null, bmOptions);
}
}
این آموزش به پایان رسید.
موفق باشید.
آموزش برنامه نویسی اندروید |
سلام. بسیار ممنون از آموزش خوبتون.
من وقتی از کد بالا اجرا میگیرم روی گوشی خودم اندروید 4.4.4 اپ عملکرد درستی داره و کار میکنه، ولی روی دو تا گوشی دیگه اجراشون کردم که یکیشون اندروید 4.4.4 و دومی اندروید 4.0.0 بود پیغام Could not set up the detector! رو روی صفحه نشون میده. علتش چیه؟ مگه barcode api گوگل روی این ورژن ها کار نمیکنه؟؟ (گوشی اولیه که ورژن اندرویدش مثل گوشی خودمه ولی باز هم همین پیغام رو میده.)
مورد بعد اینکه روی گوشی خودمم که کار میکنه وقتی میبرمش روی تصویر QR barcode، پیغام Scan Failed: Found nothing to scan رو نشون میده، من قشنگ دوربین رو روی تصویر ثابت نگه میدارم، از فاصله های مختلف حتی حاشیه بارکد رو مطابق با لبه صفحه گوشیم نگه داشتم بازم دوربین تشخیصش نمیده، چرا؟ در حالیکه گوشیم با نرم افزارهای بارکد اسکنر دیگه خیلی خوب کار میکنه!
ممنون میشم اگر نکته ای هست راهنمایی کنید.
سلام و درود
از لینک زیر استفاده کنید
https://orjinakteb.com/2018/02/16/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%ae%d9%88%d8%a7%d9%86%d8%af%d9%86-qr-code-%d8%af%d8%b1-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/
این آموزش خیلی ساده تر هست و به صورت کتابخانه هست انشالله مشکلی نداشته باشید در رابطه با فرمایشاتتون باید در بخش logcat ببینید خروجی چی هست و اینکه اگر اشتباه نکنم از api 14 این کدها باید درست کار کند و اینکه logcat رو قرار بدید بررسی کنیم نتیجه رو بهتون اعلام کنید.
موفق و پیروز باشید.