فحص الباركود باستعمل مكتبة الفايربيز اندرويد

01 July

مقدمة

الدرس الاخير من سلسلة التعلم الالي باستعمال فاير بيز و ضيفنا اليوم هو barcode حيث سيتمكن تطبيقك من قراءة مختلف انواع الباركودات و يعتبر الباركود هو الوسيلة الافضل لنقل معلومة من العالم المادي الى العالم الافتراضي لانه سهل القراءة للالة كالعادة اكثرنا من الكلام .

تطبيقات تستخدم تقنية barcode
  • سناب تشات : للتعرف على حسابات المستخدمين
  • واتساب ويب : لتسجيل الدخول الى وتساب ويب من خلال الهاتف
صورة ل barcode الخاص بي :

ما هو الباركود barcode :

اظن ان مفهوم الباركود واضح بالنسبة لك لهذا سنتتقل مباشرة الى انواع الباركود و كيف يمكن صنع باركود خاص بك .
 انواع الباركود

  • Code 128 ( FORMAT_CODE_128 )
  • Code 39 ( FORMAT_CODE_39 )
  • Code 93 ( FORMAT_CODE_93 )
  • Codabar ( FORMAT_CODABAR )
  • EAN-13 ( FORMAT_EAN_13 )
  • EAN-8 ( FORMAT_EAN_8 )
  • ITF ( FORMAT_ITF )
  • UPC-A ( FORMAT_UPC_A )
  • UPC-E ( FORMAT_UPC_E )
  • QR Code ( FORMAT_QR_CODE )
  • PDF417 ( FORMAT_PDF417 )
  • Aztec ( FORMAT_AZTEC )
  • Data Matrix ( FORMAT_DATA_MATRIX )
صنع باركود خاص بك :
 بما ان هذا ليس موضوعنا فساترك لك ابرز المواقع التي يمكنك من خلالها صنع QR code لتطبيقك مثلا .

قبل ان نبدا

1-اذا لم تقم باضافة فايربيز الى تطبيقك حتى الان فيمكنك ذلك من خلال اتباع خطوات بسيطة في تدوينة سابقة .
 2-اضف السطر التالي الى dependencies
build.gradle -> app level  

dependencies {
  // ...

  implementation 'com.google.firebase:firebase-ml-vision:16.0.0'
}
3- نقوم باضافة الكود التالي الى ملف  manifest.xml  

<meta-data android:name="com.google.firebase.ml.vision.DEPENDENCIES" android:value="text"/>
دور هذا الكود هو تحميل الملفات التي يحتاجها تطبيقك اثناء التنصيب كي لا تحدث معك اي مشكلة .اما ان لم تضفه فلا مشكلة فسيتم تحميل الملفات المرغوب فيها عند اول تشغيل لتطبيقك على هاتف المستخدم لكن لا ينصح بهذا .
4- اذونات الكاميرا ان كنت تريد استعمالها و اذونات الوصول الى الذاكرة يمكنك لهذه التدوينة ان تساعدك .

واجهة التطبيق :

بالتاكيد واجهة التطبيق تعود اليك و التطبيق الذي استعمله فيه ملفين ل xml الاول باسم image_labeling.xml و التاني باسم bottom_sheet.xml و كلاهما موجودان على github  وليست هناك حاجة الى ارفاقهما مع التدوينة
انا استعمل مكتبة للكاميرا بدلا من api الرسمي من اندرويد اسم المكتبة Fotoapparat

فحص الباركود

الفكرة العامة :
حسنا لدي تطبيق يحصل على الصور اما من التقاطها مباشرة او من خلال اخدها من ذاكرة الهاتف في كلتا الحالتين سنحول الصورة الى bitmap  و نقوم بتمريرها الى دالة باسم scanBarCode(bitmap:Bitmap) هذه الدالة تقوم باخد bitmap  و تقوم بصنع نسخة منها قابلة للتعديل لان الاصلية ليست كذلك نمرر الصورة الى الفايربيز و يقوم باعطائنا احداثيات الباركود في الصورة boundingBox نقوم نحن برسم اطار احمر على الباركود من خلال دالة drawRect()  و ناخد القيم المآخودة من الباركود rawValue .
  ربما الكود ابسط :
class Mlearing : AppCompatActivity() {
 lateinit var sheetBehavior: BottomSheetBehavior
 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.image_labeling)
  setSupportActionBar(toolbar)
  sheetBehavior = BottomSheetBehavior.from(bottom_sheet)
  val fotoapparat = Fotoapparat(context = this, view = camera_view)
  fotoapparat.start()
  //اخد صورة
  takePic.setOnClickListener {
   val photoResult = fotoapparat.takePicture()
   photoResult
     .toBitmap()
     .whenAvailable { bitmapPhoto ->
      scanBarCode(bitmapPhoto!!.bitmap)
     }
  }
  //اخد الصورة من الهاتف
  fromDevice.setOnClickListener {
   val photoPickerIntent = Intent(Intent.ACTION_GET_CONTENT)
   photoPickerIntent.type = "image/*"
   startActivityForResult(photoPickerIntent, 1)
  }

 }
 private fun scanBarCode(bitmap: Bitmap) {
  //تحويل بيتماب الى بيتماب قابل للتعديل
  val mBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
  val canvas = Canvas(mBitmap)
  //الحصول على الكود
  val image: FirebaseVisionImage = FirebaseVisionImage.fromBitmap(bitmap)
  val detector = FirebaseVision.getInstance().visionBarcodeDetector
  detector.detectInImage(image)
    .addOnSuccessListener {
     // انتهى بنجاح
     Log.e("", "gooo")
     for (barcode in it) {
      val bounds = barcode.boundingBox
      val corners = barcode.cornerPoints
      val redPaint = getPaint(Color.RED, 20f)
      canvas.drawRect(bounds, redPaint)
      val rawValue = barcode.rawValue
      Toast.makeText(this, "raw:$rawValue", Toast.LENGTH_LONG).show()
      val valueType = barcode.valueType
      Log.e("RAW VAL", "$rawValue | $valueType | ${barcode.displayValue}")
     }
     mImage.setImageBitmap(mBitmap)
     mImage.visibility = View.VISIBLE
    }.addOnFailureListener {
     // خطا ما وقع
     Toast.makeText(baseContext, "Sorry, something went wrong!", Toast.LENGTH_SHORT).show()
    }
 }
 
 private fun getPaint(color: Int, width: Float = 1f): Paint {
  val p = Paint()
  p.style = Paint.Style.STROKE
  p.strokeWidth = width
  p.isAntiAlias = true
  p.isFilterBitmap = true
  p.isDither = true
  p.color = color
  return p
 }

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
  super.onActivityResult(requestCode, resultCode, data)
  if (resultCode == RESULT_OK) {
   val chosenImageUri = data.data

   val mBitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, chosenImageUri)
   scanBarCode(mBitmap)
  }
 }
}

     
    

الناتج

للعلم فان النتائج كانت رائعة و اعجبتني و هذه screenshots  منها يمكنك تجربتها على اي منتج في المنزل و ستجد انها تعمل بشكل جيد .

 
للعلم فان وقت الاستجابة يطول و يمكنك جعله اقصر اذ حددت نوع الباركود الذي ترغب في فحص و يمكنك الاطلاع على المزيد من الموقع الرسمي .
هل ترغب في مثل هذه التدوينات

اسماعيل ايت بلا

ببساطة ارغب في تجربة جديدة من التعلم من خلال مشاركة ما تعلمه يجبرني ذلك على البحث لمدة طويلة مما يجعل الموقع جديرا بالثقة

اترك لنا تعليقا

الاشتراك بالقائمة البريدية

توصل باحدث مواضيعنا و كن على اطلاع باخر اخبار وتقنيات الاندرويد