2015-04-09 2 views
3

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

Благодарим вас в Advance.

CameraDemo.java

public class CameraDemo extends Activity { 
    private static final String TAG = "CameraDemo"; 
    Camera camera; 
    Preview preview; 
    Button buttonClick,switchCam; 
    int which=0; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     switchCam=(Button)findViewById(R.id.switchcam); 
     preview = new Preview(this); 
     ((RelativeLayout) findViewById(R.id.preview)).addView(preview); 

     buttonClick = (Button) findViewById(R.id.buttonClick); 
     buttonClick.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 

       AlertDialog.Builder alertDialog = new AlertDialog.Builder(CameraDemo.this); 

       // Setting Dialog Title 
       alertDialog.setTitle("Confirm"); 

       // Setting Dialog Message 
       alertDialog.setMessage("Are You Done ?"); 

       // Setting Icon to Dialog 
       alertDialog.setIcon(R.drawable.doneimg); 

       // Setting Positive "Yes" Button 
       alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog,int which) { 

         AlertDialog.Builder alertDialog = new AlertDialog.Builder(CameraDemo.this); 

         // Setting Dialog Title 
         alertDialog.setTitle("Confirm Student"); 

         // Setting Dialog Message 
         alertDialog.setMessage("Are you a Student?"); 

         // Setting Icon to Dialog 
         alertDialog.setIcon(R.drawable.student); 

         // Setting Positive "Yes" Button 
         alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog,int which) { 

           // Write your code here to invoke YES event 
           Intent i = new Intent(getApplicationContext(), 
             ScanId.class); 
           startActivity(i); 
           finish(); 
          } 
         }); 

         // Setting Negative "NO" Button 
         alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           // Write your code here to invoke NO event 
           Toast.makeText(getApplicationContext(), "Sorry, Only Students Allowed", Toast.LENGTH_SHORT).show(); 
           dialog.cancel(); 
          } 
         }); 

         // Showing Alert Message 
         alertDialog.show(); 
        } 
       }); 

       // Setting Negative "NO" Button 
       alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         // Write your code here to invoke NO event 
         Toast.makeText(getApplicationContext(), "Sorry, Only Students Allowed", Toast.LENGTH_SHORT).show(); 
         dialog.cancel(); 
        } 
       }); 

       // Showing Alert Message 
       alertDialog.show(); 

      } 
     }); 
     Log.d(TAG, "onCreate'd"); 



    } 


    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    /** Handles data for jpeg picture */ 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      long time = 0; 
      try { 
       // write to local sandbox file system 
//    outStream = CameraDemo.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0); 
       // Or write to sdcard 
       time = System.currentTimeMillis(); 
       outStream = new FileOutputStream(String.format("/sdcard/%d.jpg",time)); 
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 



      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

} 

NExxt Java File >> Preview.java

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.hardware.Camera; 
import android.hardware.Camera.PreviewCallback; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 


class Preview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public Camera camera; 
    int which=0; 


    Preview(Context context) { 
     super(context); 

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

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     camera = Camera.open(); 
     try { 
      camera.setPreviewDisplay(holder); 
      camera.setDisplayOrientation(90); 


      camera.setPreviewCallback(new PreviewCallback() { 

       public void onPreviewFrame(byte[] data, Camera arg1) { 
        FileOutputStream outStream = null; 
        try { 
         outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis())); 
         outStream.write(data); 
         outStream.close(); 
         Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
        } 
        Preview.this.invalidate(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 
     camera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = camera.getParameters(); 
//  parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 





    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 
     Paint p= new Paint(Color.RED); 
     Log.d(TAG,"draw"); 
     canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
} 

XML FILE

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:id="@+id/layout"> 

    <RelativeLayout android:id="@+id/preview" 
     android:layout_weight="1" android:layout_width="fill_parent" 
     android:layout_height="match_parent"> 


     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="New Button" 
      android:id="@+id/switchcam" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="170dp" /> 
    </RelativeLayout> 



    <Button android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:id="@+id/buttonClick" 
     android:text="" 
     android:layout_gravity="center_horizontal|bottom" 
     android:layout_marginBottom="50dp" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/circlebutton" 
     /> 

    <Button 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:id="@+id/gallery" 
     android:background="@drawable/grid" 
     android:layout_marginBottom="50dp" 
     android:layout_marginLeft="60dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 


</RelativeLayout> 

ответ

2

Просто откройте камеру с помощью метода open(int cameraId).

//swap the id of the camera to be used 
if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
} 
else { 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
} 
camera = Camera.open(currentCameraId); 
+0

Hello Jordi, Thanks For Reply. Я сделал это в onClick даже кнопки. Но приложение рушится, когда я нажимаю кнопку. Что мне делать ? –

+0

Вы отлаживали ?? Какая ошибка вы получаете? Вы должны дать нам knwo stacktrace и точную ошибку, ** crash ** не говорит много для меня ... Пожалуйста, обновите свой вопрос, если вы хотите получить дополнительную информацию –

+0

Обратите внимание, что указанный код неверен. Целочисленный индекс, используемый для Camera.open(), не является одной из констант в классе Camera.CameraInfo. –

Смежные вопросы