2013-11-19 6 views
1

Я парень-андроид, но мне предстоит большая задача. У меня есть кнопка изображения на моем макете. При нажатии на нее следует начать просмотр камеры. (У меня есть видео, отображаемое одновременно на другой поверхности.) Оба прекрасно работают.удаление Поверхность во время выполнения

Но при повторном нажатии кнопки предварительный просмотр должен останавливаться и поверхность должна быть удалена. Я старался, но не мог удалить поверхность. Всегда получать исключение с нулевым указателем.

Вот моя на функции мыши

public void DispPreview(View view) {   
if(camPreview == null) { 
    camPreview = new PreviwDiaplay(this,fl); 
} else { 
    //camPreview.mSurfaceView.setVisibility(View.GONE); 
    fl.removeView(camPreview.mSurfaceView); 
    camPreview.stopPreview(); 
    camPreview = null; 
} 

}

Вот мой код для предварительного просмотра класса дисплей .....

 public class PreviwDiaplay extends ViewGroup implements SurfaceHolder.Callback{ 
    Camera mCamera; 
    SurfaceHolder mHolder; 
    public SurfaceView mSurfaceView; 
    FrameLayout fl1; 
    public PreviwDiaplay(Context context) { 
     super(context); 
    } 
    public PreviwDiaplay(Context context, FrameLayout fl2) { 
     super(context); 
     fl1 = fl2; 
     mSurfaceView = new SurfaceView(context); 
     fl2.addView(mSurfaceView,160,120); 
     System.out.println("Added surface view........................"); 
     mHolder = mSurfaceView.getHolder(); 
     // TODO Auto-generated constructor stub 
     try { 
      mCamera = Camera.open(0); 
     } catch(RuntimeException e) { 
      e.printStackTrace(); 
      System.out.println("Camera not found"); 
      return; 
     } 
     Parameters p = mCamera.getParameters(); 
     p.setPictureSize(120, 90); 
     mCamera.setParameters(p); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder.addCallback(this); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder sv2, int arg1, int arg2, int arg3) { 
     Callback callback = null; 
     // TODO Auto-generated method stub 
     sv2.addCallback(callback); 
     System.out.println("surface changed in preview.........."); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     System.out.println("surface created in preview.........."); 
     if (mCamera != null) { 

      requestLayout(); 

      try { 
       mCamera.setPreviewDisplay(mHolder); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


      mCamera.startPreview(); 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     System.out.println("surfaceDestroyed......................."); 

    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     System.out.println("onLayout............."); 

    } 

    public void stopPreview() { 
     if(mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
      //mSurfaceView = null; 
//   fl1.removeView(mSurfaceView); 
     } 
    }  
} 

Вот мой XML

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/frame" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="right" 
android:background="@drawable/logo" 
android:clickable="false" > 
    <SurfaceView 
    android:id="@+id/surfaceView1" 
    android:layout_width="280dp" 
    android:layout_height="210dp" 
    android:layout_gravity="center_vertical|center_horizontal" 
    android:clickable="true"  
    android:onClick="BringCallerFront" /> 
    <RelativeLayout android:id="@+id/RelativeLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|center_horizontal" 
    style="?android:attr/buttonBarStyle" 
    android:fadeScrollbars="true"> 
<ImageButton 
    android:id="@+id/preview" 
    style="android:imageButtonStyle" 
    android:adjustViewBounds="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/preview_small" 
    android:onClick="DispPreview" 
    android:contentDescription="@string/preview"/> 
     <ImageButton 
     android:id="@+id/end_call" 
     style="android:imageButtonStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:adjustViewBounds="true" 
     android:contentDescription="@string/end_call" 
     android:onClick="FinishActivity" 
     android:scaleType="center" 
     android:scrollbarStyle="outsideInset" 
     android:src="@drawable/end_conf_small" /> 
    </RelativeLayout> 
</FrameLayout> 

Может кто-нибудь помочь мне в этом. ...

Благодаря .....................

Вот мой LogCat Информация

11-20 10:19:33.674: I/System.out(768): surfaceCreated................. 
11-20 10:19:33.704: I/System.out(768): PlayerThread ................. 
11-20 10:19:33.854: E/WVMExtractor(768): Failed to open libwvm.so 
11-20 10:19:34.154: I/OMXClient(768): Using client-side OMX mux. 
11-20 10:19:34.194: E/OMXNodeInstance(768): OMX_GetExtensionIndex failed 
11-20 10:19:34.204: I/System.out(768): PlayerThread going to start................. 
11-20 10:19:34.294: I/Choreographer(768): Skipped 236 frames! The application may be doing too much work on its main thread. 
11-20 10:19:34.444: D/gralloc_goldfish(768): Emulator without GPU emulation detected. 
11-20 10:19:34.974: I/Choreographer(768): Skipped 69 frames! The application may be doing too much work on its main thread. 
11-20 10:19:47.779: I/System.out(768): Added surface view........................ 
11-20 10:19:48.387: I/Choreographer(768): Skipped 158 frames! The application may be doing too much work on its main thread. 
11-20 10:19:48.594: I/System.out(768): surface created in preview.......... 
11-20 10:19:49.376: I/System.out(768): surface changed in preview.......... 
11-20 10:19:56.185: I/Choreographer(768): Skipped 35 frames! The application may be doing too much work on its main thread. 
11-20 10:19:56.384: I/System.out(768): surfaceDestroyed....................... 
11-20 10:19:56.434: D/AndroidRuntime(768): Shutting down VM 
11-20 10:19:56.453: W/dalvikvm(768): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
11-20 10:19:56.614: E/AndroidRuntime(768): FATAL EXCEPTION: main 
11-20 10:19:56.614: E/AndroidRuntime(768): java.lang.IllegalStateException: Could not execute method of the activity 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.View$1.onClick(View.java:3591) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.View.performClick(View.java:4084) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.View$PerformClick.run(View.java:16966) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.os.Handler.handleCallback(Handler.java:615) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.os.Looper.loop(Looper.java:137) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-20 10:19:56.614: E/AndroidRuntime(768): at java.lang.reflect.Method.invokeNative(Native Method) 
11-20 10:19:56.614: E/AndroidRuntime(768): at java.lang.reflect.Method.invoke(Method.java:511) 
11-20 10:19:56.614: E/AndroidRuntime(768): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-20 10:19:56.614: E/AndroidRuntime(768): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-20 10:19:56.614: E/AndroidRuntime(768): at dalvik.system.NativeStart.main(Native Method) 
11-20 10:19:56.614: E/AndroidRuntime(768): Caused by: java.lang.reflect.InvocationTargetException 
11-20 10:19:56.614: E/AndroidRuntime(768): at java.lang.reflect.Method.invokeNative(Native Method) 
11-20 10:19:56.614: E/AndroidRuntime(768): at java.lang.reflect.Method.invoke(Method.java:511) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.View$1.onClick(View.java:3586) 
11-20 10:19:56.614: E/AndroidRuntime(768): ... 11 more 
11-20 10:19:56.614: E/AndroidRuntime(768): Caused by: java.lang.NullPointerException 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.SurfaceView.updateWindow(SurfaceView.java:527) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:226) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.View.dispatchDetachedFromWindow(View.java:11785) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3651) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3626) 
11-20 10:19:56.614: E/AndroidRuntime(768): at android.view.ViewGroup.removeView(ViewGroup.java:3558) 
11-20 10:19:56.614: E/AndroidRuntime(768): at ofi_codec1.ofi_codec2.ofi_vc_video_codec_java_wrap.Ofi_video_encoder_test.DispPreview(Ofi_video_encoder_test.java:153) 
11-20 10:19:56.614: E/AndroidRuntime(768): ... 14 more 
11-20 10:20:00.534: I/Process(768): Sending signal. PID: 768 SIG: 9 
+0

Где именно находится nullPointer? думаю, у меня есть идея, как решить эту проблему. – bofredo

+0

@ bofredo Я добавил свою информацию о logcat Это исключение возникает, когда я использую fl.removeView (camPreview.mSurfaceView); Спасибо за ответ ...... –

+0

fl - это идентификатор макета рамки, который является его родительским макетом –

ответ

1

Наконец у меня появилась идея ,

Я использовал

camPreview.mSurfaceView.setVisibility(View.GONE); 

в stopPreview моего класса PreviwDiaplay. и поместите это в предложение try catch. и он отлично работает. И для фиксации положения макета Я использовал

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT,(Gravity.TOP| Gravity.RIGHT)); 
params.height = height; 
params.width = width; 
fl.addView(mSurfaceView, params); 
Смежные вопросы