0

led 플래시를 켤 수있는 Android 응용 프로그램을 개발했습니다. 대부분의 휴대 전화에서 정상적으로 작동하는 것으로 보이지만 Google Play에서 앱을 다운로드 할 수 있으므로 손전등에 충돌 보고서가 표시됩니다. Nexus 5에 대한 보고서도 있습니다. 전화가 같지만 문제는 전혀 없습니다. 또한플래시를 켤 때 일부 장치에서 충돌이 발생했습니다.

java.lang.RuntimeException: setParameters failed 
at android.hardware.Camera.native_setParameters(Native Method) 
at android.hardware.Camera.setParameters(Camera.java:1650) 
at android.view.View.performClick(View.java:4438) 
at android.view.View$PerformClick.run(View.java:18422) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5017) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
at dalvik.system.NativeStart.main(Native Method) 

그리고이 충돌 보고서 : 세드릭

java.lang.NullPointerException: Attempt to invoke virtual method 'void  android.hardware.Camera.setPreviewDisplay(android.view.SurfaceHolder)' on a null object reference 
at android.view.SurfaceView.updateWindow(SurfaceView.java:572) 
at android.view.SurfaceView.access$000(SurfaceView.java:86) 
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175) 
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1867) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
at android.view.Choreographer.doFrame(Choreographer.java:544) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5001) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 

사람이 사소한 단서가 있습니까 이러한 충돌 내가 무엇입니까 보고서입니다

private ImageButton mFlashButton; 
private Parameters mParams; 
private Camera mCamera; 
private Thread t; 
private ImageView ivRing; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.flashlight_fragment, 
      container, false); 

    ivRing = (ImageView) view.findViewById(R.id.ivRing); 

    // flash switch button 
    mFlashButton = (ImageButton) view.findViewById(R.id.flashlight_button); 

    // Switch button click event to toggle flash on/off 
    mFlashButton.setOnClickListener(mClickListener); 

    return view; 
} 

View.OnClickListener mClickListener = new View.OnClickListener() { 
    public void onClick(View v) { 
     if (mLightOn) { 
      turnOffFlash(); 
     } else { 
      turnOnFlash(); 
     } 
    } 
}; 

@Override 
public void onStart() { 
    super.onStart(); 
    SurfaceView preview = (SurfaceView) getView().findViewById(R.id.PREVIEW); 
    SurfaceHolder mHolder = preview.getHolder(); 
    mHolder.addCallback(this); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    turnOffFlash(true); 
} 

// Turning On flash 
private void turnOnFlash() { 

    if (!mLightOn) { 
     //if camera not found, break 
     if (mCamera == null || mParams == null) { 
      Toast.makeText(getActivity(), "Error", Toast.LENGTH_SHORT).show(); 
     } else { 
      mParams = mCamera.getParameters(); 
      mParams.setFlashMode(Parameters.FLASH_MODE_TORCH); 
      mCamera.setParameters(mParams); 
      mCamera.startPreview(); 
      mLightOn = true; 
     } 
    } 

    getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 


// Turning Off flash 
private void turnOffFlash() { 

    if (mLightOn) { 
     //if camera is null, break; 
     if (mCamera == null || mParams == null) { 
      Toast.makeText(getActivity(), "Error", Toast.LENGTH_SHORT).show(); 
     } else { 
      //strobo not running, just turn flash off 
      mParams = mCamera.getParameters(); 
      mParams.setFlashMode(Parameters.FLASH_MODE_OFF); 
      mCamera.setParameters(mParams); 
      mCamera.stopPreview(); 
      mLightOn = false; 
     } 
     getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 
} 


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

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    if (mCamera != null) { 
     mCamera.stopPreview(); 
     mCamera.setPreviewCallback(null); 
     mCamera.release(); 
     mCamera = null; 
    } 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    if (mCamera == null) { 
     //next line forced closed once, should look into this 
     try { 
      mCamera = Camera.open(); 
      mParams = mCamera.getParameters(); 
     } catch (Exception e) { 
      Toast.makeText(getActivity(), "Something went wrong, please restart flashlight", Toast.LENGTH_SHORT).show(); 
     } 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (Exception e) { 
      mCamera.release(); 
      mCamera = null; 
      Toast.makeText(getActivity(), "Something went wrong, please restart flashlight", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

} 

: 이것은 내 코드입니다 이리? 이 사전에 ..

감사를 내 넥서스 5에 충돌이 또 다른 나를 혼란에 수행하지 않는다는 사실

답변

1

일부 장치 (그들은 플래시가없는 일 수 있음)에 대한 그래서 플래시에 대한 지원을하지 않은 수 있음 이 목적은 장치가 손전등을 지원하는지 여부를 먼저 확인해야합니다.

boolean hasFlash = getApplicationContext().getPackageManager() 
     .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

if (!hasFlash) { 
    // device doesn't support flash 
    // Show alert message and close the application 
    AlertDialog alert = new AlertDialog.Builder(context) 
      .create(); 
    alert.setTitle("Error"); 
    alert.setMessage("Sorry, your device doesn't support flash light!"); 
    alert.setButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      // closing the application or what ever you want if device does not support 
      finish(); 
     } 
    }); 
    alert.show(); 
    return; 
} 
else { 
    //turn on flash light code here.... 
} 
+0

답변 해 주셔서 감사합니다. 이미 확인해 보았습니다. 이 코드는 LED 플래시가있는 장치에만 해당됩니다. –

1
mCamera.setPreviewDisplay(holder); 

이 실패 것입니다. NPE를 다른 메소드에 호출하고 NPE를 처리하지 않습니다.

+0

좀 더 자세히 설명해 주시겠습니까? 어떻게 해결해야합니까? –

+0

surfacecreated는 함수가 정말 이상합니다. 카메라가 null이면 그 인수를 시도해보십시오. 그 중 하나는 홀더도 함께 전달하는 것입니다.이 홀더도 0입니다. 실제로 setPreviewDisplay가 실제로 무엇인지 전혀 알지 못하므로이 부분을 살펴 보라고 제안합니다. – Paul

+0

나는 surfaceCreated가 activity가 시작될 때 호출된다고 믿는다. 그래서 그 시점에서 카메라가 null이면 Camera.open()으로 인스턴스화해야한다. 홀더가 onStart()에서 인스턴스화되어야한다는 점을 제외하고는 왜 이것이 때때로 실패하는지 잘 모르겠다. 내 경험에 의하면 매번 작동합니다. 방법으로 의견을 보내 주셔서 감사합니다! –