آموزش خواندن بارکد در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش خواندن بارکد در برنامه نویسی اندروید می پردازیم برای هر بارکد یک result درون خود دارد یعنی هر بارکد می توانید یک url نیز در خود جای دهد و با اسکن آن یک سایت باز شود در ادامه با ما همراه باشید.
ابتدا وارد فایل Build.gradle شده در بخش dependencies خط زیر را اضافه کرده و پروژه را sync کنید.
1 | compile 'com.google.android.gms:play-services-vision:9.6.1' |
سپس خط زیر را به AndroidManifest.xml
1 2 3 | <meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode"/> |
حالا باید دسترسی و Feauture را اضافه کنیم.
1 2 3 4 5 | <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
و کل کد AndroidManifest.xml همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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 ایجاد کرده و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?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 ایجاد کرده و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | 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://programchi.ir/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 رو قرار بدید بررسی کنیم نتیجه رو بهتون اعلام کنید.
موفق و پیروز باشید.