Ciao,
sto creando una APP Android che effettua una scansione OCR, prima di effettuare la scansione OCR vi è un Fragment con all'interno una Editext e il bottone "scansiona" dove inserire una parola da rilevare/ricercare poi nel testo scansionato.
Per la scansione OCR sono partito da questo tutorial (http://www.codeproject.com/Tips/840623/Android-Character-Recognition).
Arriviamo ora al problema, per passare una stringa da una classe ad un altra se ho ben capito bisogna utilizzare il metodo Bundle e Intent (e fin qui tutto ok), il problema è che la classe Java dove passo la stringa da comparare non fa parte di nessuna activity ed infatti ricevo il seguente errore:
Vi allego anche le due classi Java
Fragment
TessAsync.java
sto creando una APP Android che effettua una scansione OCR, prima di effettuare la scansione OCR vi è un Fragment con all'interno una Editext e il bottone "scansiona" dove inserire una parola da rilevare/ricercare poi nel testo scansionato.
Per la scansione OCR sono partito da questo tutorial (http://www.codeproject.com/Tips/840623/Android-Character-Recognition).
Arriviamo ora al problema, per passare una stringa da una classe ad un altra se ho ben capito bisogna utilizzare il metodo Bundle e Intent (e fin qui tutto ok), il problema è che la classe Java dove passo la stringa da comparare non fa parte di nessuna activity ed infatti ricevo il seguente errore:
Codice:
--------- beginning of crash
08-23 12:29:38.580 16872-16872/com.mydomain.mypp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mydomain.myapp, PID: 16872
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.mydomain.myapp/com.mydomain.myapp.TessAsyncEngine}; have you declared this activity in your AndroidManifest.xml?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1777)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1501)
at android.app.Activity.startActivityForResult(Activity.java:3745)
at android.support.v4.app.ActivityCompatJB.startActivityForResult(ActivityCompatJB.java:30)
at android.support.v4.app.ActivityCompat.startActivityForResult(ActivityCompat.java:162)
at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:914)
at android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:1009)
at android.support.v4.app.Fragment.startActivity(Fragment.java:921)
at android.support.v4.app.Fragment.startActivity(Fragment.java:910)
at com.mydomain.myapp.ScanFragment$1.onClick(ScanFragment.java:126)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
08-23 12:29:40.699 16872-16872/com.mydomain.myapp I/Process: Sending signal. PID: 16872 SIG: 9
Vi allego anche le due classi Java
Fragment
Codice:
package com.mydomain.myapp;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.text.Normalizer;
public class ScanFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
//Init DB
private DbManager db=null;
private CursorAdapter adapter;
public ScanFragment() {
// Required empty public constructor
}
// TODO: Rename and change types and number of parameters
public static ScanFragment newInstance(String param1, String param2) {
ScanFragment fragment = new ScanFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
//Inizializzo DB e cursor
db=new DbManager(getActivity());
Cursor crs=db.query();
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (OnFragmentInteractionListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout. fragment_scan,
container, false);
Button button = (Button) view.findViewById(R.id.btn_scansiona);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//do something when button is clicked.
EditText txt=(EditText) view.findViewById(R.id.textSearch);
EditText date=(EditText) view.findViewById(R.id.textDate);
//String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//Salvo contenuto del testo nel bundle e lo passo a TessAsyncEngine
Bundle bundle = new Bundle();
bundle.putString("TextSearch", txt.getText().toString());
Intent form_intent = new Intent(getActivity(), TessAsyncEngine.class);
form_intent.putExtras(bundle);
startActivity(form_intent);
if (txt.length()>0 && date.length()>0)
{
//Make the insert into DB by calling the method save define in DbManager.java
db.save(txt.getEditableText().toString(), date.getEditableText().toString());
//Show Toast if the insert is ok
Toast.makeText(getActivity(),"Saved Successfully", Toast.LENGTH_LONG).show();
}
}
});
return view;
}
}
TessAsync.java
Codice:
public class TessAsyncEngine extends AsyncTask<Object, Void, String> {
static final String TAG = "DBG_" + TessAsyncEngine.class.getName();
private Bitmap bmp;
private Activity context;
@Override
protected String doInBackground(Object... params) {
try {
if(params.length < 2) {
Log.e(TAG, "Error passing parameter to execute - missing params");
return null;
}
if(!(params[0] instanceof Activity) || !(params[1] instanceof Bitmap)) {
Log.e(TAG, "Error passing parameter to execute(context, bitmap)");
//Log.e(TAG, "Error passing parameter " + params[0].toString() + params[1].toString());
return null;
}
context = (Activity)params[0];
bmp = (Bitmap)params[1];
if(context == null || bmp == null) {
Log.e(TAG, "Error passed null parameter to execute(context, bitmap)");
return null;
}
int rotate = 0;
if(params.length == 3 && params[2]!= null && params[2] instanceof Integer){
rotate = (Integer) params[2];
}
if(rotate >= -180 && rotate <= 180 && rotate != 0)
{
bmp = Tools.preRotateBitmap(bmp, rotate);
Log.d(TAG, "Rotated OCR bitmap " + rotate + " degrees");
}
TessEngine tessEngine = TessEngine.Generate(context);
bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);
String result = tessEngine.detectText(bmp);
//detect words
Bundle bundle = context.getIntent().getExtras();
String txtSearch = bundle.getString("TextSearch");
if (result.equals(txtSearch)) {
Log.d(TAG, "I've found "+result);
String result1 = ("ATTENZIONE! contiene: ") + result.concat(" trovato");
return result1;
} else {
String result2 = ("Ho rilevato la seguente parola: ") + result.concat(" verifica che sia corretta");
return result2;
}
//Log.d(TAG, result);
//return result;
} catch (Exception ex) {
Log.d(TAG, "Error: " + ex + "\n" + ex.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String s) {
if(s == null || bmp == null || context == null)
return;
ImageDialog.New()
.addBitmap(bmp)
.addTitle(s)
.show(context.getFragmentManager(), TAG);
super.onPostExecute(s);
}
}
Ultima modifica: