在Android中使用SurfaceView在应用程序内使用相机

用户3852672

我正在创建一个应用程序,可以在其中使用相机而无需转到手机的默认应用程序。因此,我使用了表面视图并尝试将其保存到手机上,但onPictureTaken从未调用过。显示完整的代码以下:

package com.example.surfaceviewcamera;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mSurfaceHolder;
    Camera mCamera;
    boolean mPreviewRunning;
    Button btncapture;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btncapture=(Button) findViewById(R.id.btncapture);
        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        btncapture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
                    public void onPictureTaken(byte[] imageData, Camera c) {

                        Bitmap bitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);
                        String file_path=saveToInternalSorage(bitmap);
                        Toast.makeText(getApplicationContext(),"Image stored succesfully at "+file_path,Toast.LENGTH_LONG).show();
                    }

                    };

            }
        });

    }
    private String saveToInternalSorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
         // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        File mypath=new File(directory,"marina1.jpg");

        FileOutputStream fos = null;
        try {           

            fos = new FileOutputStream(mypath);

       // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return directory.getAbsolutePath();
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera=Camera.open();


    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w,
            int h) {
        if (mPreviewRunning) {
            mCamera.stopPreview();
            }
            Camera.Parameters p = mCamera.getParameters();
            p.setPreviewSize(w, h);
            mCamera.setParameters(p);
            try {
            mCamera.setPreviewDisplay(holder);
            } catch (IOException e) {
            e.printStackTrace();
            }
            mCamera.startPreview();
            mPreviewRunning = true;

    }


    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();

    }

}

我的XML文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
 android:layout_height="fill_parent"
android:orientation="vertical">

<SurfaceView
 android:id="@+id/surface_camera"
android:layout_width="fill_parent"
 android:layout_height="10dip"
android:layout_weight="1">
</SurfaceView>
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="CAPTURE IMAGE"
    android:id="@+id/btncapture"
    android:layout_gravity="center"
    />
</LinearLayout>
萨加尔·皮赫瓦尔(Sagar pilkhwal)

打电话camera.takePicture(null, null, callback);onClick()和定义外回调onCreate()

供参考,请查看此链接

public class MainActivity extends Activity implements SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mSurfaceHolder;
    Camera mCamera;
    boolean mPreviewRunning;
    Button btncapture;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btncapture=(Button) findViewById(R.id.btncapture);
        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        btncapture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //take picture here
                mCamera.takePicture(null, null, mPictureCallback);
            }
        });
    }

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {

            Bitmap bitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);
            String file_path=saveToInternalSorage(bitmap);
            Toast.makeText(getApplicationContext(),"Image stored succesfully at "+file_path,Toast.LENGTH_LONG).show();
        }
    };

    private String saveToInternalSorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
         // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        File mypath=new File(directory,"marina1.jpg");

        FileOutputStream fos = null;
        try {           

            fos = new FileOutputStream(mypath);

       // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return directory.getAbsolutePath();
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera=Camera.open();


    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int w,
            int h) {
        if (mPreviewRunning) {
            mCamera.stopPreview();
            }
            Camera.Parameters p = mCamera.getParameters();
            p.setPreviewSize(w, h);
            mCamera.setParameters(p);
            try {
            mCamera.setPreviewDisplay(holder);
            } catch (IOException e) {
            e.printStackTrace();
            }
            mCamera.startPreview();
            mPreviewRunning = true;

    }


    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();

    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android中使用SurfaceView在应用程序内使用相机

来自分类Dev

在Android中使用相机应用程序时出错

来自分类Dev

在我的应用程序中使用相机拍摄的照片是颠倒的

来自分类Dev

Android:我的应用程序禁止使用相机

来自分类Dev

使用相机时,Android应用程序关闭无错误

来自分类Dev

在Android应用程序中使用Json

来自分类Dev

在Android应用程序中使用jqMath

来自分类Dev

在 Android 应用程序中使用 iBeacons

来自分类Dev

我在 Telegram 桌面应用程序中使用时遇到了相机问题

来自分类Dev

在Qt Android应用程序中使用Holo主题

来自分类Dev

在Android WebRTC应用程序中使用DataChannel

来自分类Dev

在android应用程序中使用dll库

来自分类Dev

在Android服务应用程序中使用Google Analytics(分析)

来自分类Dev

Android:下载字体并在应用程序中使用

来自分类Dev

在Android应用程序中使用DIAL协议

来自分类Dev

为什么在Android应用程序中使用jdbc是错误的?

来自分类Dev

实现在Android应用程序中使用的单词列表

来自分类Dev

在Android中使用默认应用程序打开文件

来自分类Dev

在Android应用程序中使用OpenCV人脸识别算法

来自分类Dev

如何在Xamarin Android应用程序中使用动画?

来自分类Dev

如何在空白的Android应用程序中使用MVVMCross

来自分类Dev

如何在Android中使用多个“应用程序类”?

来自分类Dev

在Android应用程序中使用.so库时出错

来自分类Dev

为什么在Android应用程序中使用jdbc是错误的?

来自分类Dev

在Android应用程序中使用DIAL协议

来自分类Dev

在Android中使用gridview时应用程序崩溃

来自分类Dev

在Eclipse Android应用程序中使用OpenCV

来自分类Dev

在Android应用程序中使用OpenCV人脸识别算法

来自分类Dev

Android:下载字体并在应用程序中使用

Related 相关文章

  1. 1

    在Android中使用SurfaceView在应用程序内使用相机

  2. 2

    在Android中使用相机应用程序时出错

  3. 3

    在我的应用程序中使用相机拍摄的照片是颠倒的

  4. 4

    Android:我的应用程序禁止使用相机

  5. 5

    使用相机时,Android应用程序关闭无错误

  6. 6

    在Android应用程序中使用Json

  7. 7

    在Android应用程序中使用jqMath

  8. 8

    在 Android 应用程序中使用 iBeacons

  9. 9

    我在 Telegram 桌面应用程序中使用时遇到了相机问题

  10. 10

    在Qt Android应用程序中使用Holo主题

  11. 11

    在Android WebRTC应用程序中使用DataChannel

  12. 12

    在android应用程序中使用dll库

  13. 13

    在Android服务应用程序中使用Google Analytics(分析)

  14. 14

    Android:下载字体并在应用程序中使用

  15. 15

    在Android应用程序中使用DIAL协议

  16. 16

    为什么在Android应用程序中使用jdbc是错误的?

  17. 17

    实现在Android应用程序中使用的单词列表

  18. 18

    在Android中使用默认应用程序打开文件

  19. 19

    在Android应用程序中使用OpenCV人脸识别算法

  20. 20

    如何在Xamarin Android应用程序中使用动画?

  21. 21

    如何在空白的Android应用程序中使用MVVMCross

  22. 22

    如何在Android中使用多个“应用程序类”?

  23. 23

    在Android应用程序中使用.so库时出错

  24. 24

    为什么在Android应用程序中使用jdbc是错误的?

  25. 25

    在Android应用程序中使用DIAL协议

  26. 26

    在Android中使用gridview时应用程序崩溃

  27. 27

    在Eclipse Android应用程序中使用OpenCV

  28. 28

    在Android应用程序中使用OpenCV人脸识别算法

  29. 29

    Android:下载字体并在应用程序中使用

热门标签

归档