23 Haziran 2014 Pazartesi

XE5 - XE6 Android QR Code Okuma

Merhabalar,




Bu yazımda sizlere XE5 Android QR Code Okuma'dan bahsedeceğim ve tabiki siz isterseniz sadece QR yerine normal barcode bile okuyabilirsiniz size kalmış sadece göndereceğiniz parametre ile alakalı. Bu olay için kendime bir .pas dosyası hazırlamıştım, konu hiçbir şekilde bi yerden alıntı değildir. Lafı uzatmadan kodlarımıza geçelim. Hazırladığım .pas dosyasını buradan indirebilirsiniz!. Aşağıdaki kod parçalarını gerekli yerlere yazarsanız tam teşekkürlü bir Qr Code okucusunu XE5 üzerinden kullanmış olacaksınız. Ek olarak XE5'de Qr veya Barcode okumak için ZXing Barcode Scanner  programının cihazınızda yüklü olması gerekmektedir. Programın linki.

Aşağıdaki QR Codu okutabilirsiniz.


Uses
Android.QRCode
,FMX.Platform.Android
,FMX.Helpers.Android
,AndroidApi.JNI.GraphicsContentViewText
,AndroidApi.JNI.JavaTypes
,Androidapi.JNI.Net;

//Form Var
QRCodeScanner: TQRCode;

//FormCreate
QRCodeScanner := TQRCode.Create;
ZxingControl;

//FormDestroy
QRCodeScanner.Free;

//Scan Button - Tara Butonu
var
  Intent: jIntent;
begin

//İlk gönderilen parametre hangi Tür kod okutacağınızdır. Seçenekler:
//cmPRODUCT_MODE, cmQR_CODE_MODE, cmSCAN_MODE

  QRCodeScanner.Scan(cmQR_CODE_MODE, procedure(const Str: String)
  begin
    TThread.Synchronize(TThread.CurrentThread, procedure
    begin
      Memo1.Text := Str;
    end);
  end);

Ek olarak yazacağınız program için cihazda ZXing Barcode Scanner programının var olup olmadığını kendi kullandığım bir procedure ile kontrol etmiştim onuda sizler ile paylaşıyorum.

procedure ZxingControl;
  function GetZXingIntent: JIntent;
  const
    GOOGLE_ZXING = 'com.google.zxing.client.android.SCAN';
   GOOGLE_ZXING_PACKAGE = 'com.google.zxing.client.android';
 begin
    Result := TJIntent.JavaClass.init(StringToJString(GOOGLE_ZXING)); 
    Result.setPackage(StringToJString(GOOGLE_ZXING_PACKAGE)); 
  end;

  function IsIntentCallable(const AIntent: JIntent): Boolean;
  var
    LJPackageManager: JPackageManager; 
  begin
    Result := False; 
    if Assigned(AIntent) then 
    begin 
      LJPackageManager := SharedActivityContext.getPackageManager; 
      Result := LJPackageManager.queryIntentActivities(AIntent, 
      TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size <> 0; 
    end; 
  end;

  procedure OpenURL(const AURL: string);
  var
    LIntent: JIntent; 
  begin
    LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, 
    TJnet_Uri.JavaClass.parse(StringToJString(AURL))); 
    MainActivity.startActivity(LIntent); 
  end;

Var
  LIsZXingCallable: Boolean;
begin //ANA BEGİN
  LIsZXingCallable := IsIntentCallable(GetZXingIntent);
  if not LIsZXingCallable then
  begin
    MessageDlg('Cihazda ZXing bulunamadı lütfen yükleyiniz!',TMsgDlgType.mtError,[TMsgDlgBtn.mbOK] , 0); 
    OpenURL('https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=tr'); 
    MainActivity.finish(); 
  end;
end;