2016-08-09 27 views
0

schwarze Hintergrundfarbe zeigt Kürzlich CCTV-Kamera-App habe ich aber, wenn keine Kamera in Gerät haben, zeigt dieses logcat und App gestorben istWenn keine Kamera in Gerät haben, auf Android

java.lang.RuntimeException: Unable to start activity ComponentInfo{kr.co.iosystem.blackeyeonandroid/kr.co.iosystem.blackeyeonandroid.BlackEyeActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
    at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5001) 
    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:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at org.webrtc.PeerConnectionFactory.createVideoSource(PeerConnectionFactory.java:111) 
    at kr.co.iosystem.blackeyeonandroid.BlackEyeActivity.onCreate(MainActivity.java:235) 
    at android.app.Activity.performCreate(Activity.java:5231) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)  
    at android.app.ActivityThread.access$800(ActivityThread.java:135)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:136)  
    at android.app.ActivityThread.main(ActivityThread.java:5001)  
    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:785)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)  
    at dalvik.system.NativeStart.main(Native Method)  

und meine Quelle MainActivity.java

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String nameOfFrontFacingDevice = VideoCapturerAndroid.getNameOfFrontFacingDevice(); 
    String nameOfBackFacingDevice = VideoCapturerAndroid.getNameOfBackFacingDevice(); 
    VideoCapturerAndroid capturer = VideoCapturerAndroid.create(nameOfFrontFacingDevice); 
    . 
    . 
    . 
    } 

wenn keine Kamera haben. capturer diese Rückkehr null so teste ich

if (capturer == null || capturer.equals("") == true) { 
    try { 
     rebootProcess = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"}); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

und ich ausführen App. Ich mein Gerät neu gestartet, aber ich will, wenn keine Kamera haben, schwarze Farbe Hintergrund zeigt

Wenn sein verbunden Kamera dann zeigt es GLSurfaceView

glview = (GLSurfaceView) findViewById(R.id.glview); 
VideoRendererGui.setView(glview, null) ; 
try { 
    . . . . 
} catch { 
} 

vielleicht, ich Fragment benutzen? bitte rat für mich. Ich denke

if (capturer == null || capturer.equals("") == true) { 
    // showing black background ??.. 
    } 

aber ich weiß nicht, schwarzen Hintergrund Teil zeigt.

danke.

@update

MainActivity.java (full oncreate)

@Override 
protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String nameOfFrontFacingDevice = VideoCapturerAndroid.getNameOfFrontFacingDevice(); 

    if (nameOfFrontFacingDevice != null) { 
     VideoCapturerAndroid capturer = VideoCapturerAndroid.create(nameOfFrontFacingDevice); 

     MediaConstraints videoConstraints = new MediaConstraints(); 
     VideoSource videoSource = peerConnectionFactory.createVideoSource(capturer, videoConstraints); 
     localVideoTrack = peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource); 

     glview =(GLSurfaceView) findViewById.(R.id.showing); 
     VideoRendererGui.setView(glview, null); 
     try { 
      renderer = VideoRendererGui.createGui(0,0,100,100, VideoRendererGui.ScalingType.SCALE_ASPECT_FILL, true); 
      localVideoTrack.addRenderer(renderer); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mediaStream = peerConnectionFactory.createLocalMediaStream(LOCAL_MEDIA_STREAM_ID); 
     mediaStream.addTrack(localVideoTrack); 
    } else { 
     //space 
    } 

ich meine Quelle Beratung Ihrer geändert. aber auftreten nullpointerException

In anderen Teil. Wie kann ich programmgesteuert?

+0

dank @Vinoth Vino – chohyunwook

Antwort

1

Wenn es eine App ist, wo Sie Kamera dann verwenden, sollte die App nicht in Handys installieren, die diese Funktion nicht haben. In Ihrem Manifest Put:

<uses-feature android:name="android.hardware.camera" 
    required="true" /> 

[EDIT]

Nach VideoCapturerAndroid Quelle, wird die folgende Zeile null zurück, wenn keine Kamera vorhanden ist:

String nameOfFrontFacingDevice = VideoCapturerAndroid.getNameOfFrontFacingDevice(); 

in Ihrem Fall also dieser Muss selbst Null werden. Sie übergeben den Namen jedoch an create.Ich denke, das ist, wo NPE kommt aus:

VideoCapturerAndroid capturer = VideoCapturerAndroid.create(nameOfFrontFacingDevice); // name might be null 

Also, sollten Sie hier eine Null-Check setzen:

if (nameOfFrontFacingDevice != null) { 
    VideoCapturerAndroid capturer = VideoCapturerAndroid.create(nameOfFrontFacingDevice); 
} else { 
    // Other stuff 
} 

[EDIT 2]

Für Geräte ohne Kamera , Ihr Capturer würde immer noch kommen null und das schafft das Problem mit Anruf an peerConnectionFactory.createVideoSource(capturer, videoConstraints). Daher können wir sicherstellen, dass wir es nur anrufen, wenn wir die Kamera haben und die NPE vermeiden. Nun stoßen wir auf ein anderes Problem in glview.onResume() Anruf Aktivität onResume(). Also müssen wir das initialisieren, bevor wir nach der Kamera suchen. Überprüfen Sie den Code unten vorgeschlagen fix:

 String nameOfFrontFacingDevice = VideoCapturerAndroid.getNameOfFrontFacingDevice(); 
     String nameOfBackFacingDevice = VideoCapturerAndroid.getNameOfBackFacingDevice(); 
     Log.i(TAG, "VideoCapturerAndroid.getNameOfFrontFacingDevice() = " + nameOfFrontFacingDevice); 
     Log.i(TAG, "VideoCapturerAndroid.getNameOfBackFacingDevice() = " + nameOfBackFacingDevice); 
     VideoCapturerAndroid capturer = VideoCapturerAndroid.create(nameOfFrontFacingDevice); 

     // Initialising the glview here 
     glview = (GLSurfaceView) findViewById(R.id.glview); 
     VideoRendererGui.setView(glview, null); 

     MediaConstraints videoConstraints = new MediaConstraints(); 
     if (capturer == null || capturer.equals("")) { 
      Log.d(TAG, "not camera"); 

     } 
     // Doing further processing only if capturer is not null 
     else { 
      VideoSource videoSource = peerConnectionFactory.createVideoSource(capturer, videoConstraints); 

      localVideoTrack = peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource); 

      try { 
       renderer = VideoRendererGui.createGui(0, 0, 100, 100, VideoRendererGui.ScalingType.SCALE_ASPECT_FILL, true); 
       renderer_sub = VideoRendererGui.createGui(72, 72, 25, 25, VideoRendererGui.ScalingType.SCALE_ASPECT_FILL, true); 
       localVideoTrack.addRenderer(renderer_sub); 
       localVideoTrack.addRenderer(renderer); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      mediaStream = peerConnectionFactory.createLocalMediaStream(LOCAL_MEDIA_STREAM_ID); 
      mediaStream.addTrack(localVideoTrack); 

      ImageButton imageButton = (ImageButton) findViewById(R.id.backbutton); 
      imageButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        moveTaskToBack(true); 
        finish(); 
        android.os.Process.killProcess(android.os.Process.myPid()); 
       } 
      }); 
     } 
+0

Nein, ich bin nicht Erwerb Kamera Erlaubnis .. Ich verbinde Absichtlich nicht zur Kamera mein Gerät .. – chohyunwook

+0

@chohyunwook Ordnung ... meine aktualisiert prüfen antworte oben. – Shaishav

+0

@Shiaishav danke, aber dennoch auftreten NullpointerException. Bitte überprüfe meine Update Frage bitte! – chohyunwook