2016-08-25 5 views
0

Ich möchte einen String aus einem Editext innerhalb eines Fragments in eine Asyntask übergeben, wie kann ich das tun? Ich habe hier ähnliche Beiträge gelesen, mache aber etwas falsch.Android eine einzelne Zeichenfolge von einem Fragment an Asynctask übergeben

Fragment

 EditText txt=(EditText) view.findViewById(R.id.textSearch); 
     EditText date=(EditText) view.findViewById(R.id.textDate); 


     // Get Editext string and pass it to the Asynctask 
     txtSearch = txt.getEditableText().toString(); 
     Log.d(TAG, "variabile text " + txtSearch); 
     new TessAsyncEngine().execute(txtSearch); 

AsyncTask (go to // Wörter erkennen)

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 
      String textSearch = new ScanFragment().txtSearch; 


      if (result.equalsIgnoreCase(textSearch)) { 
       String result1 = ("Warning!: ") + result.concat(" found"); 
       return result1; 
      } else { 
       String result2 = ("I have found: ") + result.concat(" check it"); 
       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); 
    } 
} 

EDIT: Ich vergaß die Spur

08-25 10:41:25.210 6311-7176/com.fastnetserv.app D/DBG_com.fastnetserv.app.TessAsyncEngine: Error: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference 
                              Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference 

EDIT2 AsyncTask nach Ashish Vorschläge zu machen

public class TessAsyncEngine extends AsyncTask<Void, Void, Void> { 

    static final String TAG = "DBG_" + TessAsyncEngine.class.getName(); 

    private Bitmap bmp; 

    private Activity context; 

    String search; 

    TessAsyncEngine(String search){ 
     this.search=search; 
    } 

    @Override 
    //protected String doInBackground(Object... params) { 
    protected Void doInBackground(Void... 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"); 
      String textSearch = new ScanFragment().txtSearch; 



      if (result.equalsIgnoreCase(textSearch)) { 
       String result1 = ("WARNING! : ") + result.concat(" found"); 
       return result1; 
      } else { 
       String result2 = ("detected this word: ") + result.concat(" please check it"); 
       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); 
    } 
} 

CameraFragmnet

public class CameraFragment extends Fragment implements SurfaceHolder.Callback, View.OnClickListener, 
     Camera.PictureCallback, Camera.ShutterCallback { 

    static final String TAG = "DBG_" + MainActivity.class.getName(); 

    Button shutterButton; 
    Button focusButton; 
    FocusBoxView focusBox; 
    SurfaceView cameraFrame; 
    CameraEngine cameraEngine; 

    // 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; 

    public CameraFragment() { 
     // Required empty public constructor 
    } 

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment CameraFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static CameraFragment newInstance(String param1, String param2) { 
     CameraFragment fragment = new CameraFragment(); 
     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); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_camera, container, false); 
    } 

    // 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; 
    } 

    // Camera Code 

    public String detectText(Bitmap bitmap) { 

     TessDataManager.initTessTrainedData(getActivity()); 
     TessBaseAPI tessBaseAPI = new TessBaseAPI(); 

     //String path = "/mnt/sdcard/com.fastnetserv.app/tessdata/eng.traineddata"; 
     String path = Environment.getExternalStorageDirectory().getPath()+"/com.fastnetserv.app/files/tesseract/tessdata/eng.traineddata"; 


     Log.d(TAG, "Check data path: " + path); 

     tessBaseAPI.setDebug(true); 
     tessBaseAPI.init(path, "ita"); //Init the Tess with the trained data file, with english language 

     //For example if we want to only detect numbers 
     //Already defined on TessEngine 
     //tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, "1234567890"); 
     //tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, "[email protected]#$%^&*()_+=-qwertyuiop[]}{POIU" + 
     //  "YTREWQasdASDfghFGHjklJKLl;L:'\"\\|~`xcvXCVbnmBNM,./<>?"); 


     tessBaseAPI.setImage(bitmap); 

     String text = tessBaseAPI.getUTF8Text(); 

     //Log.d(TAG, "Got data: " + result); 
     tessBaseAPI.end(); 

     return text; 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     Log.d(TAG, "Surface Created - starting camera"); 

     if (cameraEngine != null && !cameraEngine.isOn()) { 
      cameraEngine.start(); 
     } 

     if (cameraEngine != null && cameraEngine.isOn()) { 
      Log.d(TAG, "Camera engine already on"); 
      return; 
     } 

     cameraEngine = CameraEngine.New(holder); 
     cameraEngine.start(); 

     Log.d(TAG, "Camera engine started"); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

    } 


    @Override 
    public void onResume() { 
     super.onResume(); 

     cameraFrame = (SurfaceView) getActivity().findViewById(R.id.camera_frame); 
     shutterButton = (Button) getActivity().findViewById(R.id.shutter_button); 
     focusBox = (FocusBoxView) getActivity().findViewById(R.id.focus_box); 
     focusButton = (Button) getActivity().findViewById(R.id.focus_button); 

     shutterButton.setOnClickListener(this); 
     focusButton.setOnClickListener(this); 

     SurfaceHolder surfaceHolder = cameraFrame.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     cameraFrame.setOnClickListener(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     if (cameraEngine != null && cameraEngine.isOn()) { 
      cameraEngine.stop(); 
     } 

     SurfaceHolder surfaceHolder = cameraFrame.getHolder(); 
     surfaceHolder.removeCallback(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if(v == shutterButton){ 
      if(cameraEngine != null && cameraEngine.isOn()){ 
       cameraEngine.takeShot(this, this, this); 
      } 
     } 

     if(v == focusButton){ 
      if(cameraEngine!=null && cameraEngine.isOn()){ 
       cameraEngine.requestFocus(); 
      } 
     } 
    } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     Log.d(TAG, "Picture taken"); 

     if (data == null) { 
      Log.d(TAG, "Got null data"); 
      return; 
     } 

     Bitmap bmp = Tools.getFocusedBitmap(getActivity(), camera, data, focusBox.getBox()); 

     Log.d(TAG, "Got bitmap"); 

     //new TessAsyncEngine().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, this, bmp); 
     new TessAsyncEngine().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, getActivity(), bmp); 

    } 

    @Override 
    public void onShutter() { 

    } 

} 
+0

Sie sind nur einen Parameter zu AsyncTask vorbei. Also wird die erste 'if'-Bedingung in 'doInBackground' wahr und gibt' null 'zurück. –

Antwort

0

Hier können Sie auch im Konstruktor von Async Aufgabe übergeben.
private Zeichenfolge; public TessAsyncEngine (Zeichenfolge) { this.string = string; }

+0

neue TessAsyncEngine (txtSearch) .execute(); – Ashish

+0

jetzt habe ich diesen Fehler "CameraFragment.java Fehler: (239, 9) Fehler: Konstruktor TessAsyncEngine in der Klasse TessAsyncEngine kann nicht auf bestimmte Typen angewendet werden; erforderlich: String gefunden: keine Argumente Grund: tatsächliche und formale Argumentlisten unterscheiden sich in Länge" – DarkVex

+0

AsyncTask Ashish

0

einen Konstruktor zum AsyncTask hinzufügen:

public class TessAsyncEngine extends AsyncTask<Object, Void, String> { 

    static final String TAG = "DBG_" + TessAsyncEngine.class.getName(); 

    private Bitmap bmp; 

    private Activity context; 
    String search; 

    TessAsyncEngine(String search) 
    { 
     this.search=search; 
    } 

    @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 
      String textSearch = new ScanFragment().txtSearch; 


      if (result.equalsIgnoreCase(textSearch)) { 
       String result1 = ("Warning!: ") + result.concat(" found"); 
       return result1; 
      } else { 
       String result2 = ("I have found: ") + result.concat(" check it"); 
       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); 
    } 
} 

Rufen Sie die AsyncTask wie folgt aus:

new TessAsyncEngine(txtSearch).execute(); 
+0

beigefügt Vielen Dank Ich habe Ihren Vorschlag versucht, aber jetzt habe ich diesen Fehler "\ CameraFragment.java Fehler: (239, 9) Fehler: Konstruktor TessAsyncEngine in der Klasse TessAsyncEngine kann nicht auf bestimmte Typen angewendet werden; benötigt: String gefunden: keine Argumente Grund: tatsächliche und formale Argumentlisten unterscheiden sich in der Länge " – DarkVex

Verwandte Themen