2016-08-25 60 views
0

我想将字符串从片段内的Editext传递给asynctask,我该怎么做?我在这里看过类似的帖子,但我做错了什么。Android将单个字符串从片段传递给Asynctask

片段

 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(去//检测字)

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

编辑:我忘了添加微量

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阿希什建议后

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

你逝去的只是一个参数的AsyncTask。所以'doInBackground'中的第一个'if'条件变为true,并返回'null'。 –

回答

0

在这里,您还可以通过在异步任务的构造函数。
私人字符串; public TessAsyncEngine(String string) { this.string = string; }

+0

新的TessAsyncEngine(txtSearch).execute(); – Ashish

+0

现在我得到这个错误“CameraFragment.java错误:(239,9)错误:构造函数类TessAsyncEngine中的TessAsyncEngine不能应用于给定类型;必需:找到字符串:无参数原因:实际和正式参数列表长度不同” – DarkVex

+0

AsyncTask Ashish

0

添加一个构造到的AsyncTask:

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

调用的AsyncTask是这样的:

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

谢谢我已经尝试了你的建议,但现在我得到了这个错误“\ CameraFragment.java 错误:(239,9)错误:构造函数类TessAsyncEngine中的TessAsyncEngine不能应用于给定的类型; 必需:字符串 找到:无参数 原因:实际和形式参数列表的长度不同“ – DarkVex

相关问题