2014-07-24 2 views
-2

나는 몇 가지 코드를 통합하려고하고 내가 가지고있는 라인 중 하나입니다 : 내가 활동에있을 때활동 및 단편에 대한 컨텍스트의 차이점은 무엇입니까?

mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB); 

는 오류가 없다. 내 조각에 넣을 때, 나는이 오류가 : 은 예상 : android.content.context 는 실제이 (com.xxx.ScanFragment)

이 나는 ​​것처럼 CameraPreview 방법

     public CameraPreview(Context context, Camera camera, 
        PreviewCallback previewCb, 
        AutoFocusCallback autoFocusCb) 

입니다 이 파일이 활동 파일에있을 때 오류가 발생하지 않으므로 활동과 조각 사이의 "컨텍스트"가 어떤 차이가 있는지 가정합니다.

import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.TextView; 

import com.parse.ParseUser; 

import net.sourceforge.zbar.Config; 
import net.sourceforge.zbar.Image; 
import net.sourceforge.zbar.ImageScanner; 
import net.sourceforge.zbar.Symbol; 
import net.sourceforge.zbar.SymbolSet; 

/** 
* Created by Jakub on 7/23/2014. 
*/ 
public class Pay extends Fragment { 
    private Button scanBtn; 
    private TextView formatTxt, contentTxt; 
    private Camera mCamera; 
    private CameraPreview mPreview; 
    private Handler autoFocusHandler; 

    TextView scanText; 
    Button scanButton; 

    ImageScanner scanner; 

    private boolean barcodeScanned = false; 
    private boolean previewing = true; 

    static { 
     System.loadLibrary("iconv"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_pay, container, false); 

     return rootView; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 




     autoFocusHandler = new Handler(); 
     mCamera = getCameraInstance(); 

     /* Instance barcode scanner */ 
     scanner = new ImageScanner(); 
     scanner.setConfig(0, Config.X_DENSITY, 3); 
     scanner.setConfig(0, Config.Y_DENSITY, 3); 

     mPreview = new CameraPreview(getActivity(), mCamera, previewCb, autoFocusCB); 
     FrameLayout preview = (FrameLayout)getActivity().findViewById(R.id.cameraPreview); 
     Log.d(Payspot.TAG,"This is the string:" + preview.toString()); 
     preview.addView(mPreview); 

     scanText = (TextView)getActivity().findViewById(R.id.scanText); 

     scanButton = (Button)getActivity().findViewById(R.id.ScanButton); 

     scanButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       if (barcodeScanned) { 
        barcodeScanned = false; 
        scanText.setText("Scanning..."); 
        mCamera.setPreviewCallback(previewCb); 
        mCamera.startPreview(); 
        previewing = true; 
        mCamera.autoFocus(autoFocusCB); 
       } 
      } 
     }); 
    } 




    public void onPause() { 
     super.onPause(); 
     releaseCamera(); 
    } 
    /** A safe way to get an instance of the Camera object. */ 
    public static Camera getCameraInstance(){ 
     Camera c = null; 
     try { 
      c = Camera.open(); 
     } catch (Exception e){ 
     } 
     return c; 
    } 

    private void releaseCamera() { 
     if (mCamera != null) { 
      previewing = false; 
      mCamera.setPreviewCallback(null); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    private Runnable doAutoFocus = new Runnable() { 
     public void run() { 
      if (previewing) 
       mCamera.autoFocus(autoFocusCB); 
     } 
    }; 

    Camera.PreviewCallback previewCb = new Camera.PreviewCallback() { 
     public void onPreviewFrame(byte[] data, Camera camera) { 
      Camera.Parameters parameters = camera.getParameters(); 
      Camera.Size size = parameters.getPreviewSize(); 

      Image barcode = new Image(size.width, size.height, "Y800"); 
      barcode.setData(data); 

      int result = scanner.scanImage(barcode); 

      if (result != 0) { 
       previewing = false; 
       mCamera.setPreviewCallback(null); 
       mCamera.stopPreview(); 

       SymbolSet syms = scanner.getResults(); 
       for (Symbol sym : syms) { 
        scanText.setText("barcode result " + sym.getData()); 
        barcodeScanned = true; 
       } 
      } 
     } 
    }; 

    // Mimic continuous auto-focusing 
    Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() { 
     public void onAutoFocus(boolean success, Camera camera) { 
      autoFocusHandler.postDelayed(doAutoFocus, 1000); 
     } 
    }; 
} 
+0

당신은 당신의 조각에서 활동 컨텍스트를 전달하려고 했습니까? 귀하의 조각에 getActivity() 메서드를 사용하여? –

+0

그래서 getActivity()로 바꿀까요? 아니면 정확히 어디에서 부를까요? 나는 이것을 getActivity()로 바꿨고 nullPointerException을 얻고있다. – user3794585

답변

0

활동이 컨텍스트를 확장하지만 조각은 그렇지 않습니다. 따라서 컨텍스트 매개 변수에 this을 전달할 수 있습니다. 따라서 오류 메시지는 ScanFragment를 작동하지 않는 Context의 매개 변수로 간주합니다. 각 단편은 활동의 단편과 연관됩니다. 이러한 상황에서 사용할 유효한 컨텍스트를 받으려면 getActivity() 또는 getActivity().getApplicationContext()을 사용할 수 있습니다.

새 코드는 다음과 같습니다 mPreview = new CameraPreview(getActivity(), mCamera, previewCb, autoFocusCB);

+0

그래서 이것을 getActivity()로 바꿀 수 있을까? 아니면 정확히 어디에서 부를까요? 나는 이것을 getActivity()로 바꿨고 nullPointerException을 얻고있다. – user3794585

+0

흠, getActivity()가 null을 리턴한다는 의미인가? 또는 mPreview가 null입니까? –

+0

내 코드에 추가했습니다. getActivity() 호출 아래의 줄 중 하나에서 "미리보기"처럼 보이는 것이 실제로는 관련이없는 문제 일 수 있습니다. 그것은 Activity 클래스에서 문제가 아니었고 이제 조각에 있습니다 – user3794585

1

조각에서는 문맥을 얻기 위해 getActivity() 메서드를 호출해야합니다. 단편은 활동과 연관되어야하고 활동 컨텍스트 (활동은 컨텍스트를 확장 함)가 있어야하기 때문입니다.

+0

그래서 이것을 getActivity()로 바꿀 수 있을까? 아니면 정확히 어디에서 부를까요? 나는 이것을 getActivity()로 바꿨고 nullPointerException을 얻고있다. – user3794585

관련 문제