2015-10-29 25 views
1

我正在用前置攝像頭拍攝應用程序,當用戶點擊NFC卡時,它將拍攝他們的圖像。所以我做了相機和nfc讀卡器的表面視圖,在活動中添加了這兩種功能。兩人都在分開工作,但是當我點擊一張牌面時,我感覺沒有任何回報。獲取錯誤在這行帶有前置攝像頭的NFC讀卡器

NullPointerException異常

mCamera.takePicture(null, null, ReadCardActivity.this); 

我添加了一個按鈕,也波紋管的surfaceview如果我點擊該圖像拍攝沒有任何問題。

我的代碼波紋管 -

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_read_card); 
    ButterKnife.bind(this); 

    mPreview = (SurfaceView) findViewById(R.id.preview); 
    mPreview.getHolder().addCallback(this); 
    mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mDialog = new AlertDialog.Builder(this).setNeutralButton("Ok", null).create(); 

    mAdapter = NfcAdapter.getDefaultAdapter(this); 
    if (mAdapter == null) { 
     showMessage(R.string.error, R.string.no_nfc); 
     finish(); 
     return; 
    } 

    // do we have a camera? 
    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
     Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG).show(); 
     finish(); 
    } else { 
     cameraId = findFrontFacingCamera(); 
     //cameraId = findBackFacingCamera(); 
     if (cameraId < 0) { 
      Toast.makeText(this, "Sorry you don't have secondary camera", Toast.LENGTH_LONG).show(); 
      finish(); 
     } else { 
      releaseCameraAndPreview(); 
      mCamera = Camera.open(cameraId); 
     } 
    } 

    mPendingIntent = PendingIntent.getActivity(this, 0, 
      new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
    mAdapter = NfcAdapter.getDefaultAdapter(this); 

    mNdefPushMessage = new NdefMessage(new NdefRecord[]{newTextRecord(
      "Message from NFC Reader :-)", Locale.ENGLISH, true)}); 
} 


private void releaseCameraAndPreview() { 
    if (mCamera != null) { 
     mCamera.release(); 
     mCamera = null; 
    } 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mCamera.release(); 
    mAdapter.disableForegroundDispatch(this); 
    Log.d("CAMERA", "Destroy"); 
} 

@OnClick(R.id.buttonCaptureImage) 
public void capturingImage() { 
    System.gc(); 
    mPreview.post(new Runnable() { 
     public void run() { 
      mCamera.takePicture(null, null, ReadCardActivity.this); 
     } 
    }); 
} 
+0

您沒有包含點擊NFC卡時拍攝照片的代碼。你在活動中使用'BroadcastReceiver'嗎? –

+0

如果您需要更多信息,然後更新您的問題 – Majkl

+0

我解決了這個問題,謝謝你的回覆,我會更新答案。 – Anirban

回答

1

我認爲你需要有自己的回調,而不是ReadCardActivity.this

我處理考勤同樣的事情(當用戶是伴隨着標記,然後前置攝像頭拍照),所以我可以給我的代碼(但在C#Xamarin)

這是回調類

private class PictureTakenCallback : Java.Lang.Object, Camera.IPictureCallback 
{ 
    private Context parentContext; 
    public event PictureTakenEventHandler OnPictureTakenAndReady; 
    public PictureTakenCallback() 
    {//There have to empty construtor 
    } 
    public PictureTakenCallback(Context pParentContext) 
    { 
    this.parentContext = pParentContext; 
    } 
    public void OnPictureTaken(byte[] pData, Camera pCamera) 
    { 
    try 
    { 
     if (OnPictureTakenAndReady != null) OnPictureTakenAndReady(null, new PictureTakenEventArgs(pData)); 
    } 
    catch (Exception ex) 
    { 
     string msg = ex.Message; 
     ((Activity)parentContext).RunOnUiThread(() => { Toast.MakeText(parentContext, "PictureTakenCallback Exception", ToastLength.Long).Show(); }); 
    } 
    } 
} 

相機後打開創建回調

  pictureTakenCallback = new PictureTakenCallback(parentContext); 
      pictureTakenCallback.OnPictureTakenAndReady += new PictureTakenEventHandler(pictureTakenCallback_OnPictureTakenAndReady); 

此刻,當你接受nfcAdapter意圖調用此方法

public void TakePicture() 
    { 
     if (cameraFront != null) 
     { 
     try 
     { 
      cameraFront.TakePicture(null, null, null, pictureTakenCallback); 
      ((Activity)parentContext).RunOnUiThread(() => { Toast.MakeText(parentContext, "After TakePicture", ToastLength.Long).Show(); }); 
     } 
     catch (Exception ex) 
     { 
      ((Activity)parentContext).RunOnUiThread(() => { Toast.MakeText(parentContext, "Exception during TakePicture", ToastLength.Long).Show(); }); string msg = ex.Message; 
     } 
     } 
    } 

如果相機拍攝一張照片吧,然後再來此事件

private void pictureTakenCallback_OnPictureTakenAndReady(object sender, PictureTakenEventArgs e) 
    { 
     if (e.Data != null && e.Data.Length > 0) byte[] photoInBytes = e.Data; 
     if (cameraFront != null) 
     { 
     cameraFront.StartPreview(); 
     CameraController.IsPreviewStopped = true; 
     } 
    } 

注意,你需要StartPreview的權利和SurfaceView必須可見

就個人而言,我會推薦將相機的所有內容放入單獨的文件/類中,然後製作一個簡單的界面,而不是將其直接提供給活動。

相關問題