Cómo reconocer caracteres de texto en Android a través de la codificación

Espero que no estés buscando un personaje de una cadena. Para lo cual tenemos,

charAt (int index) – Devuelve el char en el index

Creyendo que desea reconocer el texto en imágenes en el dispositivo Android. Al usar Aspose API puedes reconocer el texto. El usuario podrá copiar el texto reconocido y pegarlo en cualquier otra aplicación, como un correo electrónico o un mensaje de texto. Necesitará lo siguiente:

  • Herramientas para desarrolladores de Android (ADT)
  • Aspose.OCR para Cloud

Antes de que empieces:

  1. Descargue, instale y configure ADT en su computadora.
  2. Cree y configure el dispositivo virtual Android o conecte un dispositivo Android real con su computadora para realizar pruebas.
  3. Configure un entorno completo de trabajo y prueba.

Crear proyecto

  1. En el menú Archivo , seleccione Nuevo , luego Proyecto de aplicación de Android . Se muestra el cuadro de diálogo Nueva aplicación de Android .
  2. Ingrese el nombre de la aplicación , el nombre del proyecto y el nombre del paquete . Deje las otras configuraciones como predeterminadas.
  3. Haga clic en Siguiente , Siguiente , Siguiente y Siguiente .
  4. Haz clic en Finalizar .

IU de aplicación

En Project Explorer, haga doble clic en res / layout / activity_main.xml . activity_main.xml es la interfaz de usuario de nuestra aplicación. Haga clic derecho y seleccione la opción Cambiar diseño . Elija LinearLayout (Vertical) de la lista y haga clic en Aceptar . Desde la paleta, arrastre un botón y una vista de texto al área de fondo blanco. Ajuste su ancho, altura y posición con el mouse como se muestra en la siguiente captura de pantalla:

Queremos acceder a TextView dentro de nuestro código, por lo que debemos agregarle algún identificador. Haga clic con el botón derecho en el TextView recién agregado, haga clic en Editar ID , Ingrese los resultados de texto y haga clic en Aceptar Ahora podemos acceder usando R.id.text_results. Vaya a la ventana Propiedades y borre la propiedad llamada Texto . Queremos mantener nuestra vista de resultados en blanco. Cambie a la vista XML de activity_main.xml y agregue el atributo textIsSelectable al elemento TextView .

activity_main.xml

Haga clic en el botón recién agregado para seleccionar e ir a la ventana Propiedades en el lado derecho. Edite la propiedad Texto y cambie su valor a Tomar foto . La actualización de la propiedad cambiará la etiqueta / título del botón. Desplácese hacia abajo y encuentre otra propiedad Al hacer clic . Cambie su valor para captureImage . Queremos asociar un método Java llamado captureImage con el evento click de este botón. Discutiremos el código del método más adelante.

Permisos de aplicación

Nuestra aplicación utilizará algunas funciones proporcionadas por el sistema, como la cámara, el almacenamiento y la conexión a Internet. Tenemos que adquirir permisos para estos recursos. Busque el archivo AndroidManifest.xml en la ventana del Explorador de proyectos y haga doble clic para abrirlo. Agregue el siguiente código bajo el elemento .

AndroidManifest.xml

… …

Implementación

Nuestro código tiene cuatro partes principales.

  1. captureImage Enviar solicitud a la cámara para capturar una foto y guardarla en un dispositivo externo
  2. onActivityResult Reciba resultados de la cámara cuando nuestra foto esté lista.
  3. OcrTask Realizar operación de API para nosotros
  4. displayTextResults Mostrar resultados de OCR

Implementaremos cada parte de nuestro código paso a paso y lo explicaremos. Comencemos con captureImage. Como podemos ver en la sección anterior, captureImage es el controlador onClick de nuestro botón Tomar foto . Por lo tanto, la firma del método debe seguir las especificaciones de Android:

MainActivity.java

public class MainActivity extiende ActionBarActivity {// … public void captureImage (Ver vista) {// …} // …}

Para capturar una imagen usando la cámara, usamos la intención de la cámara MediaStore.ACTION_IMAGE_CAPTURE con MediaStore.EXTRA_OUTPUT como intenciones adicionales. Cuando se especifica MediaStore.EXTRA_OUTPUT, la intención de la cámara guardará la imagen capturada en nuestra ubicación deseada.

Necesitamos dos cosas más para manejar el proceso de solicitud-resultado, es decir, un identificador de solicitud y un archivo temporal donde guardaremos la imagen capturada. Actualicemos nuestro código en consecuencia e implementemos la función de cámara.

MainActivity.java

clase pública MainActivity extiende ActionBarActivity {// … estática protegida final int REQUEST_IMAGE_CAPTURE = 1; Archivo tmpfile; public void captureImage (Ver vista) {Intención i = nueva intención (MediaStore.ACTION_IMAGE_CAPTURE); if (i.resolveActivity (getPackageManager ())! = null) {try {tmpfile = File.createTempFile (“Photo”, “.jpg”, Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)); } catch (IOException x) {// Estamos perdidos 🙂 lanzar una nueva RuntimeException (x); } i.putExtra (MediaStore.EXTRA_OUTPUT, Uri.fromFile (archivo tmp)); startActivityForResult (i, REQUEST_IMAGE_CAPTURE); }} //…}

No sabemos cuándo se completará la actividad de la cámara y nuestra aplicación reanudará su funcionamiento normal. Así que esperaremos y escucharemos los resultados en segundo plano. Android proporciona el método onActivityResult para este propósito. Lo agregaremos a nuestra clase MainActivity como se especifica en la documentación de Android.

MainActivity.java

public class MainActivity extiende ActionBarActivity {//… @Override protected void onActivityResult (int request, int result, Intent data) {if (request == REQUEST_IMAGE_CAPTURE && result == RESULT_OK) {if (tmpfile == null) {Log.e ( “onActivityResult”, “La foto no se guardó. No hacer nada”); regreso; } nuevo OcrTask (). execute (tmpfile); displayTextResults (“Carga de fotos y reconocimiento de texto. Esto puede demorar unos segundos”); }} //…}

Aquí en onActivityResult hemos utilizado REQUEST_IMAGE_CAPTURE y tmpfile de captureImage. También hemos utilizado OcrTask y displayTextResults, que son nuestro próximo tema.

OcrTask es una subclase de AsyncTask, que es el método estándar de Android para realizar tareas en segundo plano asincrónicas de corta duración. Como la operación de la red, como las llamadas a la API REST, puede retrasarse a veces debido a interrupciones de la red, por lo tanto, está prohibido realizarlas en el hilo principal de la plataforma Android. Debemos usar AsyncTask para llamar a Aspose para las API de la nube. Agreguemos la clase a nuestro programa y expliquemos cada parte en detalle.

MainActivity.java

public class MainActivity extiende ActionBarActivity {//… public class OcrTask extiende AsyncTask {String requestUrl; String appSID = “xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”; String appKey = “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”; @Override protected void onPreExecute () {super.onPreExecute (); // Nuestra implementación va aquí …} @Override protected String doInBackground (File … params) {// Nuestra implementación va aquí …} @Override protected void onPostExecute (String result) {super.onPostExecute (result); // Nuestra implementación va aquí …}}}

Tenemos tres métodos aquí. Se llama a onPreExecute antes de que se inicie la operación asincrónica. No tiene parámetros. Aquí realizamos algunas operaciones iniciales y preparamos una URL de solicitud firmada. Una URL firmada significa asegurarse de que estamos autorizados para hacer esa llamada a la API. Necesitamos appSID y appKey para este propósito, que se puede obtener registrándose gratis en http://cloud.aspose.com/.

OcrTask.onPreExecute

@Override protected void onPreExecute () {super.onPreExecute (); requestUrl = “https://api.aspose.com/v1.1/ocr/recognize?appSID=” + appSID; intente {Mac mac = Mac.getInstance (“HmacSHA1”); mac.init (nueva SecretKeySpec (appKey.getBytes (), “HmacSHA1”)); mac.update (requestUrl.getBytes ()); Firma de cadena = Base64.encodeToString (mac.doFinal (), Base64.NO_PADDING); requestUrl + = “& signature =” + signature; Log.i (“onPreExecute”, “URL de solicitud firmada:” + requestUrl); } catch (Exception x) {lanzar una nueva RuntimeException (x); }}

DoInBackground realizará la llamada API real. Estamos utilizando HttpUrlConnection como cliente Http. Subiremos nuestro archivo de imagen capturado. La respuesta devuelta está en formato JSON y el método de solicitud HTTP es POST. Entonces configuraremos los parámetros de conexión en consecuencia.

OcrTask.doInBackground

@Override String protegido doInBackground (Archivo … params) {Archivo de archivo = params [0]; Conexión HttpURLConnection = nulo; pruebe {FileInputStream fstream = new FileInputStream (archivo); int fsize = fstream.available (); conexión = (HttpURLConnection) nueva URL (requestUrl) .openConnection (); connection.setRequestMethod (“POST”); connection.setDoOutput (verdadero); connection.setRequestProperty (“Aceptar”, “aplicación / json”); connection.setRequestProperty (“Content-Length”, String.valueOf (fsize)); OutputStream upload = connection.getOutputStream (); byte [] buffer = nuevo byte [10240]; int len; while ((len = fstream.read (buffer))! = -1) {upload.write (buffer, 0, len); } upload.close (); fstream.close (); InputStream i = connection.getInputStream (); Texto de cadena = nuevo escáner (i) .useDelimiter (“\\ A”). Next (); cierro(); //file.delete (); Log.i (“doInBackground”, texto); texto de retorno; } catch (FileNotFoundException fnfx) {InputStream e = connection.getErrorStream (); Texto de cadena = nuevo escáner (e) .useDelimiter (“\\ A”). Next (); Log.i (“doInBackground”, texto); texto de retorno; } catch (Exception x) {lanzar una nueva RuntimeException (x); }}

Después de recuperar los resultados de Aspose.OCR para la API de la nube, necesitamos un poco de manipulación. Como la respuesta es JSON, ahora debería leer el texto reconocido y también verificar si hay algún error. Haremos la manipulación en el método onPostExecute.

OcrTask.onPostExecute

@Override protected void onPostExecute (String result) {super.onPostExecute (result); Texto de cadena = “”; pruebe {JSONObject json = new JSONObject (resultado); if (json.has (“Estado”) && json.getString (“Estado”). es igual a (“OK”)) {text = json.getString (“Texto”); } else if (json.has (“Mensaje”)) {text = “Error:” + json.getString (“Mensaje”); }} catch (JSONException x) {lanzar una nueva RuntimeException (x); } displayTextResults (texto); }

Ahora viene la parte más simple pero importante de nuestra aplicación, es decir, mostrar los resultados de texto reconocidos. Simplemente cambiamos la propiedad de texto de TextView que agregamos a nuestra interfaz de usuario al principio. Agregamos el id text_results y también dijimos que podemos hacer referencia a él desde el código usando R.id.text_results. Aquí vamos:

MainActivity.java

public class MainActivity extiende ActionBarActivity {//… public void displayTextResults (String text) {TextView t = (TextView) findViewById (http: //R.idhttp: //R.id.text_results); t.setText (texto); } // …}

Al poner todo junto, hemos capturado una imagen usando la cámara del dispositivo, la hemos guardado en un archivo temporal en un almacenamiento externo, utilizamos Aspose.OCR para Cloud para reconocer el texto en esa imagen, utilizamos AsyncTask para REST API, mostramos los resultados en la pantalla . El usuario puede copiar el texto y pegarlo en cualquier otra aplicación.

Fuente: Componentes de formato de archivo para .NET Java SSRS SharePoint JasperReports