安卓:覆盖在Android摄像头preVIEW摄像头、Android、preVIEW

由网友(阳光下的温暖°)分享简介:我用照相机API和调用摄像头。 我要上的摄像头preVIEW顶部显示标题(品牌推广)。标题为JPEG图像。 这可能吗?任何帮助AP preciated。在此先感谢。我的code进入如下图所示。公共类CameraActivity延伸活动{@覆盖保护无效的onPause(){super.onPause();}私有静态最终诠...

我用照相机API和调用摄像头。

我要上的摄像头preVIEW顶部显示标题(品牌推广)。标题为JPEG图像。

这可能吗?任何帮助AP preciated。

在此先感谢。

我的code进入如下图所示。

 公共类CameraActivity延伸活动{
    @覆盖
    保护无效的onPause(){

        super.onPause();
    }

    私有静态最终诠释CAMERA_PIC_REQUEST = 2500;
    私人位图图像2;
    私人位图BM;
    公共静态字符串的ImagePath;
    公共静态INT X = 1;
    私人RdmsDbAdapter dbHelper;
    @覆盖



    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.header);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        // caling新事件
        如果(IncidentFormActivity.incident_id == NULL || IncidentFormActivity.isDisable ==真){
            // DBAdapter实例创建和打开连接。
            dbHelper =新RdmsDbAdapter(CameraActivity.this);
            dbHelper.open();

            //设置标志
            NewIncidentHelper美国国立卫生研究院=新NewIncidentHelper();
            nih.setUpNewIncident();

            //设置incident_id
            字符串日期= IncidentIdGenerator.getDate();
            字符串时间= IncidentIdGenerator.getTime();

            IncidentFormActivity.incident_id = IncidentIdGenerator.now(ddMMyyyyHHmmss);
            dbHelper.executeSQL(插入事件的值('+ IncidentFormActivity.incident_id
                    +','','','','','+日期+','0','0','0','0','0','0','0' ,'0','0','+时间+'));
            dbHelper.close();
        }

        //调用摄像头
        意图cameraIntent =新的意图(
                android.provider.MediaStore.ACTION_IM​​AGE_CAPTURE);
        startActivityForResult(cameraIntent,CAMERA_PIC_REQUEST);


    }
    公共字符串getPath(URI URI){
        的String []投影= {MediaStore.Images.Media.DATA};
        光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
        INT与Column_Index =光标
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        返回cursor.getString(Column_Index中);
    }

    在电话pressed //返回键
    @覆盖
    公共布尔的onkeydown(INT键code,KeyEvent的事件){
        开关(钥匙code){
        案例KeyEvent.KEY code_BACK:
            意图I =新的意图(CameraActivity.this,IncidentFormActivity.class);
            startActivity(ⅰ);
            this.finish();

            打破;

        默认:
            打破;
        }
        返回super.onKeyDown(键code,事件);
    }

    从相机//处理反应过来的照片拍摄后。
    保护无效onActivityResult(INT申请code,INT结果code,意图数据){
        如果(要求code == CAMERA_PIC_REQUEST和放大器;&安培;结果code == RESULT_OK){
                最后ImageView的IMG =新ImageView的(这一点);
                img.setLayoutParams(新的LayoutParams(100,100));
                。IMAGE2 =(位图)data.getExtras()获得(数据);
                img.setImageBitmap(IMAGE2);
                字符串incident_ID = IncidentFormActivity.incident_id;
                //l2.addView(img);
                    的ImagePath =/ SD卡/关系数据库管理系统/+ incident_ID + X +的.png;
                档案文件=新的文件(的ImagePath);
                尝试 {
                     BM = Bitmap.createScaledBitmap(image2,400,300,真正的);
                    file.createNewFile();
                    FileOutputStream中的ostream =新的FileOutputStream(文件);
                    bm.com preSS(比较pressFormat.PNG,90,ostream的);
                    ostream.close();
                    //正在初始化数据库类,并插入值
                    dbHelper =新RdmsDbAdapter(CameraActivity.this);
                    dbHelper.open();
                    dbHelper.executeSQL(插入到文件中的值('+的ImagePath +','+ IncidentFormActivity.incident_id +'));
                    dbHelper.close();

                }赶上(例外五){
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),yourfirst错误消息
                                            + e.toString(),1000).show();
                }
                X ++;
                最后AlertDialog.Builder警报=新AlertDialog.Builder(
                        CameraActivity.this);

                alert.setTitle(的getString(R.string.anotherimage));
                alert.setCancelable(假);
                //alert.setMessage("Play或删除所选)的视频;
                //alert.setIcon(R.drawable.vid_red);
                alert.setPositiveButton(的getString(R.string.yes),新DialogInterface.OnClickListener(){
                    公共无效的onClick(DialogInterface对话框,INT ID){
                        意图sendingpage =新的意图(CameraActivity.this,CameraActivity.class);
                          startActivity(sendingpage);

                    }
                });
                alert.setNegativeButton(的getString(R.string.no)
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话框,INT ID){
                                意图回调=新的意图(CameraActivity.this,IncidentFormActivity.class);
                                startActivity(回调);
                            }
                        });

                alert.show();


            }
            如果(结果code == RESULT_CANCELED)
            {

                AlertDialog.Builder建设者=新AlertDialog.Builder(CameraActivity.this);

                builder.setMessage(的getString(R.string.areuexit))。setCancelable(
                        假).setPositiveButton(的getString(R.string.yes)
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话框,INT ID){
                                意图I =新的意图(CameraActivity.this,IncidentFormActivity.class);
                                startActivity(ⅰ);
                                CameraActivity.this.finish();
                            }
                        })。setNegativeButton(的getString(R.string.no)
                        新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话框,INT ID){
                                dialog.cancel();
                                意图I =新的意图(CameraActivity.this,CameraActivity.class); startActivity(ⅰ);
                                CameraActivity.this.finish();
                            }
                        });

                builder.show();



            }
        }
    }
 

解决方案

您可以使用SurfaceView,并创建一个CustomView,将打开摄像头,你可以在XML相应地调整其大小。下面是一个伪code。

创建扩展SurfaceView和开放的相机内,一个类

捕捉preview.java

 公共类捕获preVIEW延伸SurfaceView实现SurfaceHolder.Callback {

    公共静态位图mBitmap;
    SurfaceHolder持有人;
    静态相机mCamera;

    公共捕捉preVIEW(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);

        支架= getHolder();
        holder.addCallback(本);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @覆盖
    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,高度INT){

        Camera.Parameters参数= mCamera.getParameters();
        parameters.getSupported previewSizes();
        mCamera.setParameters(参数);
        mCamera.start preVIEW();
    }
    @覆盖
    公共无效surfaceCreated(SurfaceHolder持有者){

        尝试 {
            mCamera = Camera.open();
            mCamera.set previewDisplay(保持器);

        }赶上(例外五){
            e.printStackTrace();
        }
    }
    @覆盖
    公共无效surfaceDestroyed(SurfaceHolder持有者){
        mCamera.stop preVIEW();
        mCamera.release();
    }
    / ***
     *
     *拍照,并和从字节[]为位图转换。
     *
     * /
    公共静态无效takeAPicture(){

        Camera.PictureCallback mPictureCallback =新PictureCallback(){
            @覆盖
            公共无效onPictureTaken(byte []的数据,摄像头摄像头){

                BitmapFactory.Options选项=新BitmapFactory.Options();
                mBitmap = BitmapFactory.de codeByteArray(数据,0,data.length,期权);
            }
        };
        mCamera.takePicture(NULL,NULL,mPictureCallback);
    }
}
 
android直接调用摄像头

现在,你必须包括您在使用SurfaceView在XML创建这样的观点

的main.xml

 < XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的
  的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
  机器人:方向=垂直
  机器人:layout_width =FILL_PARENT
  机器人:layout_height =FILL_PARENT>

  <的FrameLayout
  机器人:ID =@ + ID / mySurfaceView
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT>

  < com.cam.Capture preVIEW
  机器人:layout_width =FILL_PARENT
  机器人:layout_height =WRAP_CONTENT>
  < /com.cam.Capture$p$pview>

  < /的FrameLayout>

  <的LinearLayout
  机器人:layout_below =@ ID / mySurfaceView
  机器人:layout_width =FILL_PARENT
  机器人:layout_height =WRAP_CONTENT
  机器人:layout_centerInParent =真
  机器人:重力=中心>

  < ImageView的机器人:ID =@ + ID / myImageView
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT
  机器人:SRC =@可绘制/图标/>
  < / LinearLayout中>

< / RelativeLayout的>
 

现在你可以在任何 Acitivty ,将打开一个摄像头,一个的ImageView 使用main.xml中。 谢谢....

I'm using Camera API and invoking the camera.

I want to display a header (for branding) on the top of the camera preview. The header is a jpeg image.

Is it possible? Any help appreciated.

Thanks in advance.

My code goes as below.

public class CameraActivity extends Activity {
    @Override
    protected void onPause() {

        super.onPause();
    }

    private static final int CAMERA_PIC_REQUEST = 2500;
    private Bitmap image2;
    private Bitmap bm;
    public static String imagepath;
    public static int x=1;
    private RdmsDbAdapter dbHelper;
    @Override



    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.header);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        //caling new incident
        if(IncidentFormActivity.incident_id == null || IncidentFormActivity.isDisable==true){
            //DBAdapter instance created and connection opened. 
            dbHelper = new RdmsDbAdapter(CameraActivity.this);
            dbHelper.open();

            //setting up flags
            NewIncidentHelper nih = new NewIncidentHelper();
            nih.setUpNewIncident();

            //setting up incident_id
            String Date= IncidentIdGenerator.getDate();
            String Time = IncidentIdGenerator.getTime();

            IncidentFormActivity.incident_id = IncidentIdGenerator.now("ddMMyyyyHHmmss");
            dbHelper.executeSQL("insert into incident values ('" + IncidentFormActivity.incident_id
                    + "', ' ', ' ', ' ', ' ', '"+Date+"', '0','0','0','0','0','0','0','0','0','"+Time+"')");
            dbHelper.close();
        }

        //calling camera
        Intent cameraIntent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);


    }
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

    //back key on phone pressed
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            Intent i= new Intent(CameraActivity.this, IncidentFormActivity.class);
            startActivity(i);
            this.finish();

            break;

        default:
            break;
        }
        return super.onKeyDown(keyCode, event);
    }

    //handle response came from camera when the picture is taken.
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
                final ImageView img = new ImageView(this);
                img.setLayoutParams(new LayoutParams(100, 100));
                image2 = (Bitmap) data.getExtras().get("data");
                img.setImageBitmap(image2);
                String incident_ID = IncidentFormActivity.incident_id;
                //l2.addView(img);
                    imagepath="/sdcard/RDMS/"+incident_ID+ x + ".png";
                File file = new File(imagepath);
                try {
                     bm = Bitmap.createScaledBitmap( image2,400, 300, true);
                    file.createNewFile();
                    FileOutputStream ostream = new FileOutputStream(file);
                    bm.compress(CompressFormat.PNG, 90, ostream);
                    ostream.close(); 
                    //Initialising db class and inserting values
                    dbHelper = new RdmsDbAdapter(CameraActivity.this);
                    dbHelper.open();
                    dbHelper.executeSQL("insert into files values ('"+imagepath+"', '"+IncidentFormActivity.incident_id+"')");
                    dbHelper.close();

                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),"yourfirst  error message is "
                                            + e.toString(), 1000).show();
                }
                x++;
                final AlertDialog.Builder alert = new AlertDialog.Builder(
                        CameraActivity.this);

                alert.setTitle(getString(R.string.anotherimage));
                alert.setCancelable(false);
                //alert.setMessage("Play or Delete the Video selected");
                //alert.setIcon(R.drawable.vid_red);
                alert.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Intent sendingpage = new Intent(CameraActivity.this, CameraActivity.class);
                          startActivity(sendingpage);

                    }
                });
                alert.setNegativeButton(getString(R.string.no),
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Intent callback = new Intent (CameraActivity.this, IncidentFormActivity.class);
                                startActivity(callback);
                            }
                        });

                alert.show();


            }
            if(resultCode==RESULT_CANCELED)
            {

                AlertDialog.Builder builder = new AlertDialog.Builder(CameraActivity.this);

                builder.setMessage(getString(R.string.areuexit)).setCancelable(
                        false).setPositiveButton(getString(R.string.yes),
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Intent i= new Intent(CameraActivity.this, IncidentFormActivity.class);
                                startActivity(i);
                                CameraActivity.this.finish();
                            }
                        }).setNegativeButton(getString(R.string.no),
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                                Intent i= new Intent(CameraActivity.this, CameraActivity.class);                            startActivity(i);
                                CameraActivity.this.finish();
                            }
                        });

                builder.show();



            }
        }
    }

解决方案

You can use SurfaceView and create a CustomView that will open the camera and you can adjust its size in the xml accordingly. Below is a pseudo code.

Create a class that extends SurfaceView and open camera inside that

CapturePreview.java

public class CapturePreview extends SurfaceView implements SurfaceHolder.Callback{

    public static Bitmap mBitmap;
    SurfaceHolder holder;
    static Camera mCamera;

    public CapturePreview(Context context, AttributeSet attrs) {
        super(context, attrs);

        holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

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

        Camera.Parameters parameters = mCamera.getParameters();
        parameters.getSupportedPreviewSizes();
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        try {
            mCamera = Camera.open();
            mCamera.setPreviewDisplay(holder);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();
    }
    /***
     * 
     *  Take a picture and and convert it from bytes[] to Bitmap.
     *  
     */
    public static void takeAPicture(){  

        Camera.PictureCallback mPictureCallback = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {

                BitmapFactory.Options options = new BitmapFactory.Options();
                mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
            }
        };
        mCamera.takePicture(null, null, mPictureCallback);
    }
}

Now you have to include the view that you created using SurfaceView in your xml like this

main.xml

<?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">

  <FrameLayout 
  android:id="@+id/mySurfaceView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">

  <com.cam.CapturePreview 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content">
  </com.cam.CapturePreview>

  </FrameLayout>

  <LinearLayout 
  android:layout_below="@id/mySurfaceView" 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:gravity="center">

  <ImageView android:id="@+id/myImageView" 
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/icon"/>
  </LinearLayout>  

</RelativeLayout>

Now you can use this main.xml in any Acitivty that will open a camera with a ImageView. Thanks....

阅读全文

相关推荐

最新文章