
Originariamente inviato da
Ferri
Lui dice:
Per codificare una stringa in un codice QR semplicemente creare un Intent con l'azione Decode specificato, due extra stringa che specifica il tipo e dati e startActivity call ():
codice:
Intent intent = new Intent("com.google.zxing.client.android.ENCODE");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("ENCODE_TYPE", "TEXT_TYPE");
intent.putExtra("ENCODE_DATA","HELLO WORLD");
startActivity(intent)
Ma come faccio a "creare un Intent con l'azione Decode specificato" e le due extra stringhe?
Ciao,
or dunque - prima di cominciare - volevo chiederti se hai correttamente importato nel project (immagino tu usi eclipse) il file android-integrator.jar del barcode scanner zxing e -conseguentemente- incluso nel project le classi di adapter per la cattura del risultato:
IntentIntegrator.java
IntentResult.java
(scaricabili dalla cartella source del programma:
/trunk/android-integration/src/com/google/zxing/integration/android/ - zxing - Multi-format 1D/2D barcode image processing library with clients for Android, Java - Google Project Hosting
Premesso questo, veniamo a come eseguire la scansione e catturare il tipo di ean (magari per te superfluo) e il cod. ean stesso (forse questo ti interessa).
La classe IntentIntegrator.java possiede già il metodo per iniziare la scansione, si chiama .initiatescan.
Tutto quello che devi fare è creare una ulteriore classe che avvii IntentIntegrator.initiateScan() e che catturi il risultato della lettura (intesa come IntentResult), al termine della scansione, con il solito metodo onActivityResult().
Ti faccio un esempio in cui introduco (previe soddisfatte le pre-condizioni di progetto che ti ho indicato a inizio post) una classe di comodo per avviare la scansione e fare il get della lettura + il relativo layout .xml:
Classe AndroidScanner.java:
codice:
package mia.applicazione.test;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
public class AndroidScanner extends Activity {
TextView format=null;
TextView contents=null;
Bundle bundlescanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen3);
format=(TextView)findViewById(R.id.format);
contents=(TextView)findViewById(R.id.contents);
Button confermaScansione = (Button) findViewById(R.id.pulsanteConfermaBarCode);
confermaScansione.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0){
Intent intent = new Intent();
intent.putExtra("formato", format.getText().toString());
intent.putExtra("codiceletto", contents.getText().toString());
setResult(RESULT_OK,intent);
finish();
}
});
}
public void doScan(View v) {
IntentIntegrator.initiateScan(this);
}
public void onActivityResult(int request, int result, Intent i) {
IntentResult scan=IntentIntegrator.parseActivityResult(request,result, i);
if (scan!=null) {
format.setText(scan.getFormatName());
contents.setText(scan.getContents());
}
}
@Override
public void onSaveInstanceState(Bundle state) {
state.putString("format", format.getText().toString());
state.putString("contents", contents.getText().toString());
}
@Override
public void onRestoreInstanceState(Bundle state) {
format.setText(state.getString("format"));
contents.setText(state.getString("contents"));
}
}
Layout utilizzato da AndroidScanner.java (l'ho chiamato screen3.xml):
codice:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Avvia Scansione!"
android:onClick="doScan"
/>
<TextView android:id="@+id/format"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:background="#FF0000FF"
/>
<TextView android:id="@+id/contents"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/pulsanteConfermaBarCode"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Conferma BarCode"
/>
</LinearLayout>
Noterai che ho utilizzato il metodo android per la gestione degli eventi click dei pulsanti, ovvero valorizzando la proprietà android:onClick
all'interno del file xml (in questo caso lancio il metodo 'doScan' della classe AndroidScanner.java, che non fa altro che lanciare il metodo
InitiateScan della classe IntentIntegrator.java di zxing).
Cosa avviene:
1) il richiamo del metodo doScan() avvia la scansione.
2) viene di fatto aperta l'applicazione zxing direttamente in modalita scansione.
3) alla scansione di un cod. ean valido, automaticamente ritorni alla tua applicazione e vengono passati indietro i dati relativi alla scansione,
(IntentIntegrator.parseActivityResult(request,resu lt, i)
in questo caso io ne prendo solo 2, perchè sono quelli più significativi, ovvero:
.getFormatName() (sarebbe la stringa che denota il tipo di ean rilevato, ad es. EAN 13, EAN 8, ecc...)
.getContents() (questo è il codice a barre, lo puoi memorizzare in una stringa e passarlo al tuo URL, nel mio caso lo visualizzo in un TextView).
E questo è quanto. Tralascio i commenti per il codice rimasto, poichè sarebbero superflui.
Spero che l'utilizzo dell'ottimo sw di zxing ora ti sia maggiormente chiaro e che questo post ti sia stato utile 
A presto