Подтвердить что ты не робот

Как делать снимки с камеры без предварительного просмотра, когда начнется мое приложение?

Теперь все, что я хочу, это приложение, которое просто снимает картинку с камеры при запуске. Нет макета, нет предварительного просмотра камеры... ничего, просто простой значок приложения для запуска приложения. После запуска камера должна сделать снимок.

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

enter image description here

Как только фотография будет сделана, мне нужно сохранить ее в моей фотогалерее.

Может ли кто-нибудь мне вести меня? Благодаря

Вот код, который я пробовал на эмуляторе и устройстве.

import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class Main extends Activity implements SurfaceHolder.Callback{

    private Camera camera;
     private ImageButton cameraClick;
     private SurfaceHolder mHolder; 

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

      SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
      mHolder = surfaceView.getHolder();
      mHolder.addCallback(this);
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  

      cameraClick = (ImageButton) findViewById(R.id.cameraClick);
      cameraClick.setOnClickListener( new OnClickListener() {
       public void onClick(View v)
       {
            camera.takePicture(shutterCallback, rawCallback,jpegCallback);
       }
      });  





      }

     // Handles when shutter open
     ShutterCallback shutterCallback = new ShutterCallback()
     {
      public void onShutter()
      {   

      }
     };

     /** Handles data for raw picture */
     PictureCallback rawCallback = new PictureCallback()
     {
      public void onPictureTaken(byte[] data, Camera camera)
      {   

      }
     }; 

     /** Handles data for jpeg picture */
     PictureCallback jpegCallback = new PictureCallback()
    {
      public void onPictureTaken(byte[] data, Camera camera)
    {
       // we do something using return byte[] of taken image.
      }
     };

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

      // Set camera preview size,orientation,rotation using parameters 

    Camera.Parameters parameters = camera.getParameters();
            parameters.set("orientation", "portrait");
            camera.setParameters(parameters);
             camera.startPreview();       

     }

     @Override
     public void surfaceCreated(SurfaceHolder holder)
    {
      camera = Camera.open();
             try {
        camera.setPreviewDisplay(holder);
       }
    catch (IOException e)
    {
        e.printStackTrace();
       }

     }

     @Override
     public void surfaceDestroyed(SurfaceHolder holder)
    {
      camera.stopPreview();
             camera.release();
            camera = null; 

     }

}

Теперь я могу услышать изображение, щелкнув по кнопке, как на эмуляторе, так и на устройстве. Теперь я хочу также сохранить изображение. Любая подсказка?

4b9b3361

Ответ 1

Используйте код ниже. Его протестировали и работали для меня. Любые вопросы, пожалуйста, не стесняйтесь комментировать.

private void takeSnapShots()
{
      Toast.makeText(getApplicationContext(), "Image snapshot   Started",Toast.LENGTH_SHORT).show();
     // here below "this" is activity context.  
 SurfaceView surface = new SurfaceView(this);
    Camera camera = Camera.open();
    try {
        camera.setPreviewDisplay(surface.getHolder());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    camera.startPreview();
    camera.takePicture(null,null,jpegCallback);
}


 /** picture call back */
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) 
{
    FileOutputStream outStream = null;
    try {
  String dir_path = "";// set your directory path here
        outStream = new FileOutputStream(dir_path+File.separator+image_name+no_pics+".jpg");    
        outStream.write(data);
        outStream.close();
        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally 
    {
        camera.stopPreview();
        camera.release();
        camera = null;
        Toast.makeText(getApplicationContext(), "Image snapshot Done",Toast.LENGTH_LONG).show();


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

Ответ 2

Начиная с уровня API-уровня 11 был добавлен SurfaceTexture. С его помощью SurfaceView больше не требуется. Я проверил следующий код с моей Samsung Galaxy S3 Neo.

mCamera = Camera.open();
try {
    mCamera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e1) {
    Log.e(Version.APP_ID, e1.getMessage());
}

Parameters params = mCamera.getParameters();
params.setPreviewSize(640, 480);
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
params.setPictureFormat(ImageFormat.JPEG);
mCamera.setParameters(params);
mCamera.startPreview();
mCamera.takePicture(null, null, null, new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.i(Version.APP_ID, "picture-taken");
    }
});

Ответ 3

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

Например, в вашем файле макета, где вы добавляете предварительный просмотр камеры SurfaceView, вы можете просто добавить еще один вид поверх него, чтобы заблокировать предварительный просмотр. Таким образом, вы все равно сможете использовать свой существующий код, не изменяя слишком много, и предварительный просмотр камеры будет работать так же, как и раньше, но вы получите тот эффект, который вы ищете, который не показывает предварительный просмотр камеры.

Ответ 4

Я пробовал точно, что вам нужно до и после многих исследований выяснилось, что по какой-то причине вы должны запустить предварительный просмотр и даже показать, что контент в SurfaceView сможет получить изображение, по-видимому, систему, стоящую за сцены снимают все, что находится в буфере для визуализации SurfaceView, что теперь я сделал, чтобы преодолеть эту проблему (взяв снимок без предварительного просмотра), чтобы просто установить SurfaceView в моем макете на ширину 1dp и высоту 1dp (обратите внимание, что это должно быть 1dp, 0dp приведет к сбою).

<SurfaceView
   android:layout_width="1dp"
   android:layout_height="1dp"/>

Это определенно может быть не очень элегантный способ избавиться от изображения "предварительного просмотра", но он определенно делает трюк и оставляет мне комнату, чтобы делать все остальное, что я имел в виду.

Надеюсь, что это поможет...

Привет