精华内容
下载资源
问答
  • 安卓照相机开发

    2015-11-19 18:19:58
    目前的智能手机大都已支持照相机应用,在安卓开发中也经常会用到照相机这一模块,那么该如何调用这一模块呢?一般有两种方法,不过也是根据具体需要来定,如果只是调用照相机应用,不涉及其他操作,建议直接调用系统...

            目前的智能手机大都已支持照相机应用,在安卓开发中也经常会用到照相机这一模块,那么该如何调用这一模块呢?

        一般有两种方法,不过也是根据具体需要来定,如果只是调用照相机应用,不涉及其他操作,建议直接调用系统原生照相机,如果希望个性化定制照相机应用,则需要自己设计显示框、相机参数和功能操作等。

        1、调用系统原生照相机:

           可以在源代码中定义一个调用相机的方法,并在方法中加入如下语句:    

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
            intent.putExtra("camerasensortype", 2); // 调用前置摄像头,不同屏可能参数不同  
            intent.putExtra("autofocus", false); // 是否自动对焦  
            intent.putExtra("fullScreen", false); // 是否全屏  
            intent.putExtra("showActionIcons", false); //是否显示活动图标 
      
            startActivityForResult(intent, PICK_FROM_CAMERA);//启动照相机应用
                2、自定义照相机:

           首先要创建一个相机类:CameraDialog.java

    package com.android.xxx;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.util.List;
    
    import com.android.xxx.R;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.res.Configuration;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.CameraInfo;
    import android.hardware.Camera.PictureCallback;
    import android.hardware.Camera.Size;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.PowerManager;
    import android.view.Display;
    import android.view.KeyEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.EditText;
    import android.widget.ImageView;
    
    public class CameraDialog extends Activity {
    	SurfaceView sView;
    	SurfaceHolder surfaceHolder;
    	int screenWidth, screenHeight;
    	// 定义系统所用的照相机
    	public static Camera camera = null;
    	public static CameraDialog instance = null;
    	// 是否在浏览中
    	boolean isPreview = false;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
    				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    		// 设置全屏
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    				WindowManager.LayoutParams.FLAG_FULLSCREEN);
    		setContentView(R.layout.camera_dialog1);
    		instance = this;
    		WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    		Display display = wm.getDefaultDisplay();
    		// 获取屏幕的宽和高
    		screenWidth = display.getWidth();
    		screenHeight = display.getHeight();
    
    		// 获取界面中SurfaceView组件
    		sView = (SurfaceView) findViewById(R.id.sView);
    		// 获得SurfaceView的SurfaceHolder
    		surfaceHolder = sView.getHolder();
    		// 为surfaceHolder添加一个回调监听器
    		surfaceHolder.addCallback(new Callback() {
    			public void surfaceChanged(SurfaceHolder holder, int format,
    					int width, int height) {
    			}
    
    			public void surfaceCreated(SurfaceHolder holder) {
    				// 打开摄像头
    				initCamera();
    			}
    
    			public void surfaceDestroyed(SurfaceHolder holder) {
    				// 如果camera不为null ,释放摄像头
    				if (camera != null) {
    					if (isPreview)
    						camera.stopPreview();
    					camera.release();
    					camera = null;
    				}
    			}
    		});
    		// 设置该SurfaceView自己不维护缓冲
    		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
    		// MyTag可以随便写,可以写应用名称等
    		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    		// 换成PowerManager.SCREEN_DIM_WAKE_LOCK会变暗)
    		PowerManager.WakeLock wl = pm.newWakeLock(
    				PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyTest1");
    		wl.acquire();// 开启屏幕常亮
    	}
    
    	private void initCamera() {
    		if (!isPreview) {
    			camera = Camera.open(0);//指定要打开的摄像头0为后置,1为前置
    		}
    		if (camera != null && !isPreview) {
    			try {
    				Camera.Parameters parameters = camera.getParameters();
    				// 设置预览照片的大小
    				// 设置显示图像旋转90度
    				if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
    					setDisplayOrientation(camera, 90);
    				} else {
    					if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    						parameters.set("orientation", "portrait");
    						parameters.set("rotation", 90);
    					}
    					if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    						parameters.set("orientation", "landscape");
    						parameters.set("rotation", 90);
    					}
    				}
    
    				List<Size> sizes = parameters.getSupportedPreviewSizes();
    				Size optimalSize = getOptimalPreviewSize(sizes, 0, 0);
    				parameters.setPreviewSize(optimalSize.width, optimalSize.height);//可根据优选方法设定预览分辨率,默认全屏显示
    				// parameters.setPreviewSize(screenWidth, screenHeight);//可设置指定的预览分辨率(一般只支持:176x144,320x240,352x288,480x360,640x480这几个分辨率,可根据实际情况来选)
    				// 每秒显示4帧
    				parameters.setPreviewFrameRate(5);
    				// 设置图片格式
    				parameters.setPictureFormat(PixelFormat.JPEG);
    				// 设置JPG照片的质量
    				parameters.set("jpeg-quality", 85);
    				// 设置照片的大小
    				// parameters.setPictureSize(3264, 2448);//根据相机本身支持的分辨率大小
    				// parameters.setPictureSize(optimalSize.width,optimalSize.height);//如果不清楚分辨率大小,可调用优选方法自动指定一个分辨率
    				// parameters.setPictureSize(screenWidth, screenHeight);
    				camera.setParameters(parameters);
    				// 通过SurfaceView显示取景画面
    				camera.setPreviewDisplay(surfaceHolder);
    				// 开始预览
    				camera.startPreview();
    				// 自动对焦
    				camera.autoFocus(null);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			isPreview = true;
    		}
    	}
    
    	public void setDisplayOrientation(Camera camera, int angle) {
    		Method downPolymorphic;
    		try {
    			downPolymorphic = camera.getClass().getMethod(
    					"setDisplayOrientation", new Class[] { int.class });
    			if (downPolymorphic != null)
    				downPolymorphic.invoke(camera, new Object[] { angle });
    		} catch (Exception e1) {
    		}
    	}
    
    	@Override
    	public boolean onKeyDown(int keyCode, KeyEvent event) {
    		switch (keyCode) {
    		// 当用户单击照相键、中央键时执行拍照
    		case KeyEvent.KEYCODE_DPAD_CENTER:
    		case KeyEvent.KEYCODE_CAMERA:
    			if (camera != null && event.getRepeatCount() == 0) {
    				// 拍照
    				camera.takePicture(null, null, myjpegCallback);
    				return true;
    			}
    			break;
    		}
    		return super.onKeyDown(keyCode, event);
    	}
    
    	PictureCallback myjpegCallback = new PictureCallback() {
    		public void onPictureTaken(byte[] data, Camera camera) {
    			// 根据拍照所得的数据创建位图
    			final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,
    					data.length);
    			// 加载/layout/save.xml文件对应的布局资源
    			View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
    			final EditText photoName = (EditText) saveDialog
    					.findViewById(R.id.phone_name);
    			// 获取saveDialog对话框上的ImageView组件
    			ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
    			// 显示刚刚拍得的照片
    			show.setImageBitmap(bm);
    			// 使用对话框显示saveDialog组件
    			new AlertDialog.Builder(CameraDialog1.this).setView(saveDialog)
    					.setPositiveButton("保存", new OnClickListener() {
    						public void onClick(DialogInterface dialog, int which) {
    							// 创建一个位于SD卡上的文件
    							File file = new File(Environment
    									.getExternalStorageDirectory(), photoName
    									.getText().toString() + ".jpg");
    							FileOutputStream outStream = null;
    							try {
    								// 打开指定文件对应的输出流
    								outStream = new FileOutputStream(file);
    								// 把位图输出到指定文件中
    								bm.compress(CompressFormat.JPEG, 100, outStream);
    								outStream.close();
    							} catch (IOException e) {
    								e.printStackTrace();
    							}
    						}
    					}).setNegativeButton("取消", null).show();
    			// 重新浏览
    			camera.stopPreview();
    			camera.startPreview();
    			isPreview = true;
    		}
    	};
    
    	private Size getOptimalPreviewSize(List<Size> sizes, int w, int h)//分辨率尺寸优选方法 
            {
    		final double ASPECT_TOLERANCE = 0.05;
    		double targetRatio = (double) w / h;
    		if (sizes == null)
    			return null;
    		Size optimalSize = null;
    		double minDiff = Double.MAX_VALUE;
    		int targetHeight = h;
    		// Try to find an size match aspect ratio and size
    		for (Size size : sizes) {
    			double ratio = (double) size.width / size.height;
    			if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
    				continue;
    			if (Math.abs(size.height - targetHeight) < minDiff) {
    				optimalSize = size;
    				minDiff = Math.abs(size.height - targetHeight);
    			}
    		}
    		// Cannot find the one match the aspect ratio, ignore the requirement
    		if (optimalSize == null) {
    			minDiff = Double.MAX_VALUE;
    			for (Size size : sizes) {
    				if (Math.abs(size.height - targetHeight) < minDiff) {
    					optimalSize = size;
    					minDiff = Math.abs(size.height - targetHeight);
    				}
    			}
    		}
    		return optimalSize;
    	}
    }
            其次,在主类中创建调用方法,并在其中添加如下两句:

         Intent intent = new Intent(MainActivity.this, CameraDialog.class);
         startActivity(intent);
            在适当的时候调用该方法即可。

           最后,注意在AndroidManifest.xml中添加相关权限配置:

        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android:hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
            至此,自定义的照相机应用便设计出来了,它包含预览、自动对焦、拍照和照片存储功能。          




    展开全文
  • Android开发手机相机

    2014-12-30 16:51:11
    Android设计开发Android手机相机的设计与实现。
  • Android开发手机相机应用 1.开发环境 Android Studio(附软件配置教程https://blog.csdn.net/hongfei568718926/article/details/100531916) 2.实现方法 (1)AndroidManifest.xml文件的配置 需要在默认的基础...

    Android开发手机相机应用

    1.开发环境

    Android Studio(附软件配置教程https://blog.csdn.net/hongfei568718926/article/details/100531916

    2.实现方法

    (1)AndroidManifest.xml文件的配置

    需要在默认的基础上面加上

    <uses-permission android:name="android.permission.CAMERA"/>   更多<uses-permission>请参考

    这里解释一下<uses-permission>的意思Android SDK中定义的访问某些功能的权限参数,当应用程序需要使用这些功能的时候需要使用<user-permission/>标注明确的权限。

    <permission/>意思是:一个应用程序自定义的权限,可以供其他应用程序使用本应用的说明

    贴出我的AndroidManifest.xml文件信息

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.chen.myapplication">
        <uses-permission android:name="android.permission.CAMERA"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    (2)布局activity_main.xml文件配置

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.chen.myapplication.MainActivity">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            tools:layout_editor_absoluteX="8dp"
            tools:ignore="MissingConstraints">
    
            <SurfaceView
                android:id="@+id/surfaceView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentEnd="true"
                android:layout_toEndOf="@+id/imageView"
                tools:layout_editor_absoluteX="8dp"
                tools:layout_editor_absoluteY="8dp" />
    
    
            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:text="拍照"
                tools:layout_editor_absoluteX="160dp"
                tools:layout_editor_absoluteY="447dp" />
    
            <ImageView
                android:id="@+id/imageView"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                app:srcCompat="@android:color/background_light"
                tools:layout_editor_absoluteX="8dp"
                tools:layout_editor_absoluteY="8dp" />
        </RelativeLayout>
    
    
    
    </android.support.constraint.ConstraintLayout>
    

    (3)MainActivity的类信息

    package com.example.chen.myapplication;
    
            import android.graphics.Bitmap;
            import android.graphics.BitmapFactory;
            import android.graphics.ImageFormat;
            import android.hardware.Camera;
            import android.support.v7.app.AppCompatActivity;
            import android.os.Bundle;
            import android.view.SurfaceHolder;
            import android.view.SurfaceView;
            import android.view.View;
            import android.widget.Button;
            import android.widget.ImageView;
            import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback ,View.OnClickListener{
    
        private Button btn;//按钮的在代码中的体现,btn为名称可随意更改
        private SurfaceView mSurFaceView;
        private ImageView mImageView;
        private SurfaceHolder mSurfaceHolder;//用于获取SurfaceView的句柄,使其能被mCamera使用,以打开相机
        private Camera mCamera;//照相机的个体。
        private Camera.Parameters parameters;//相机的参数设置的变量
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //接下来的代码是将布局中的工具和代码中的个体对应起来,或者说联系起来
            btn = (Button) findViewById(R.id.button);
            mSurFaceView = (SurfaceView) findViewById(R.id.surfaceView);
            mImageView = (ImageView) findViewById(R.id.imageView);
            //在此之后就可以使用btn、mSurfaceView、mImageView来对布局中的工具进行操作了
            mImageView.setVisibility(View.GONE);//设置这个工具不可见
            btn.setText("拍照");//如代码所示,可以更改按钮的名字
            mSurfaceHolder = mSurFaceView.getHolder();//代码作用直译即可
            mSurfaceHolder.addCallback(this);
            btn.setOnClickListener(this);//设置按钮监听事件,这样当用户按按钮的时候就可以在单击事件函数里得到单击的信息了
        }
    
        //在Surface创建的时候执行这个函数
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mCamera = Camera.open();//打开摄像头(后摄像头),效果就是从此,mCamera就控制了手机的摄像头
            try{
                mCamera.setPreviewDisplay(mSurfaceHolder);//之后,mCamera从摄像机里获得的图像,就会实时的显示在mSurfaceView中。
                mCamera.setDisplayOrientation(90);//使你预览的画面呈现为正常的视觉画面,可是删除此行试试效果
                parameters = mCamera.getParameters();//将现在camera的参数设置保存到变量parameter中
                //接下来的代码是对mCamera参数的调整,或者说设置
                parameters.setPreviewSize(parameters.getSupportedPreviewSizes().get(0).width,parameters.getSupportedPreviewSizes().get(0).height);//设置预览的尺寸,通过此种方法可设置为最大预览尺寸(我觉得)
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);         //设置适合照片对焦
                parameters.setRotation(90);//跟mCamera.setDisplayOrientation(90);有类似的作用
                parameters.setPictureFormat(ImageFormat.JPEG);//设置得到的照片模式
    
                mCamera.setParameters(parameters);//这就是将我们改变的相机参数设置到相机里了
                mCamera.startPreview();//开始预览相机画面
    
            }catch (IOException e){//如果上面try中的代码有代码执行出错,就会来到这里
                e.printStackTrace();
                mCamera.release();//释放摄像头,避免发生一直占用摄像头的情况
                mCamera=null;//使mCamera为空,就是不代表任何东西。这也是保护代码
            }
        }
        //在Surface被改变的时候执行这个函数
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            //此处不填任何代码,因为本程序中不需要这个功能,但是这个函数不能删除
        }
        //在Surface销毁的时候执行这个函数
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();//停止预览,毕竟Surface都已经销毁了
            mCamera.release();
            mCamera=null;
        }
    
        //单击事件,这个函数收集所有的单击事件
        @Override
        public void onClick(View v) {
            if(v.getId()==R.id.button){//当用户单击的是button的时候执行下面的代码
                mCamera.autoFocus(null);//聚焦
                mCamera.takePicture(null,null,mPictureCallback);//开始照相,mPictureCallback为回调函数
            }
        }
        private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                mImageView.setVisibility(View.VISIBLE);//设置这个工具可见
                Bitmap btm = BitmapFactory.decodeByteArray(data, 0, data.length);//将照片数据变成图像
                mImageView.setImageBitmap(btm);//显示这个图像
            }
        };
    
    }
    
    

    (4)打包APP,然后安装在手机即可(虚拟器一般跑不出来哦,需要手机测试)

    会弹出成功标志,然后点击locate即可调到APP打包好的文件.

    3.实验结果

    展开全文
  • 安卓手机相机应用

    2016-03-31 01:00:35
    安卓开发 手机相机程序,照片旋转处理
  • 随着安卓手机市场的不断扩大,再加上3G的推出对整个行业...安卓手机软件开发 Android应用开发 一、Java SE 编程 Java 是一种面向对象的开发语言,Android操作系统的应用层使用Java语言来开发,所以要想进行Android...

    随着安卓手机市场的不断扩大,再加上3G的推出对整个行业的巨大推动作用。于此同时也引爆了安卓手机应用软件开发行业的火热发展。越来越多的应届大学生开始关注安卓手机软件开发行业,因为安卓工程师展现出良好的发展前景。

    安卓手机软件开发 Android应用开发

    一、Java SE 编程

    Java 是一种面向对象的开发语言,Android操作系统的应用层使用Java语言来开发,所以要想进行Android开发必须有良好的Java基础。这一阶段的学习,要牢固掌握Java 中的基本语法,掌握面向对象的程序设计思想,及开发工具的使用。之后学习常用类,多线程等高级特性,学习Java网络编程,了解网络通讯结构,掌握数据库语言及JDBC对数据库的访问,了解数据结构与算法,设计模式,项目开发工具的使用等内容。为后续的学习打一夯实的基础。

    二、Android 基础应用开发

    这一阶段的学习主要是掌握Android的系统架构,熟悉整个android开发环境的搭建,以及的常用命令和工具的使用,熟练掌握Andoid的UI开发,包括使用标准控件,以及自定义各式各样的UI控件,配合动画部分的使用,让自己UI设计更加炫丽更加吸引。最后在自己的应用中植入广告,发布到Market中,享受挣钱的乐趣。

    三、Android 核心组件开发

    精通Android应用开发核心组件的使用,包括Acitivity窗口活动管理;连接各个组件起到通讯作用的Intent信使;存在于服务端不可见的Service组件;为数据提供共享的ContentProvider;之后要掌握Andorid中很实用的数据存储,以及复习Java中的网络技术,并将它结合到android的开发当中,特别是常用的http通信,以及XML,Json数据的解析。中间通过不同项目让我们去强化该部分的知识。

    四、Android 深入开发

    通过前面的三个阶段的学习,这一阶段主要是把前面的内容作为基础,结合一些实际的应用,让Android开发更加多样化,当然需要一些练习了,不妨可以尝试一下多媒体方面,如:音视频播放,照相机,闹钟等;常用设备方面,如:GPS,重力传感器,指南针等;还有基本的Android图形开发,绘制自己的View部件以及通过Bitmap对图片作一些处理。然后在此基础之上,学习高级的游戏开发引擎,2D,3D的图形处理。

    Android手机应用软件的技术在不断的更新,因此开发人员要不断的学习新的知识,才能开发出功能齐全的手机应用软件,才能适应这有创新的市场。

    发布于:http://www.cnblogs.com/hanlongyi/

    文章原创来自:http://www.innoo.cn/

    转载于:https://www.cnblogs.com/hanlongyi/p/5641244.html

    展开全文
  • Android使用camera开发手机相机应用

    千次阅读 2018-10-04 17:06:36
    首先先介绍一下我使用的编写软件:Android studio。 注:图片看不清楚不同着急,最后会将所有的代码都给各位的 接下来我们创建一个新的项目,之后来到activity_main.xml下: 将&lt;TextView******/&gt;删除...

    首先先介绍一下我使用的编写软件:Android studio。
    注:图片看不清楚不同着急,最后会将所有的代码都给各位的
    接下来我们创建一个新的项目,之后来到activity_main.xml下:
    在这里插入图片描述
    将<TextView******/>删除,换上这个

    <RelativeLayout
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:layout_marginBottom="8dp"
               app:layout_constraintBottom_toBottomOf="parent"
               tools:layout_editor_absoluteX="8dp">
                
                
    </RelativeLayout>
    

    这是一种布局方式。
    接下来就可以在这里添加工具了
    在这里插入图片描述
    我选用的是SurfaceView、Button、ImageView这三个工具。
    打算通过SurfaceView来显示照相机的预览信息,Button来控制拍照,ImageView来显示拍摄的图片。
    布局文件部分代码如下
    在这里插入图片描述
    具体的layout_width和layout_height可自己调整
    之后我们来到MainActivity.java之中,我们在这里添加一些变量个体
    在这里插入图片描述
    这里要特别注意包含的文件,不能是android.graphics,应当是带划线的android.hardware。
    接下来要做的就是将布局的工具和代码联系起来
    在这里插入图片描述
    最后我们添加一个回调函数,如上。选择之后会出现如下界面
    在这里插入图片描述
    上面选中的三个函数就是我们添加的回调函数了。
    第一个函数是SurfaceView创建的时候会调用的函数,我们在这个函数里面打开摄像头,并调整摄像头的一些参数,在这个函数最后,我们预览照相机的信息,将预览信息放在SurfaceView上显示。
    意思就是当SurfaceView创建好的时候我们就打开摄像头,调整摄像头的参数,在将摄像头获取的图片放到SurfaceView中预览。
    在这里插入图片描述
    而第二个函数我们什么都不写,意思就是在SurfaceView改变的时候我们什么都不做。

    在第三个函数中,我们将摄像头释放,避免资源占用。算是保护措施的一种

    之后我们就可以设置单击事件了,我们先在最上边的大函数里添加一个这个
    在这里插入图片描述
    接着将鼠标光标放在这个上边,按Alt+Enter呼出这个
    在这里插入图片描述
    选择选中的那一项,就会出现这个
    在这里插入图片描述
    之后,我们来到系统自动创建的这个函数里。
    这个函数就是处理所有单击事件的地方
    我们在里面做一个判断,是否是按钮被单击了,如果是,我们就用摄像头聚焦一下,然后拍照。
    其他更加优秀的聚焦代码就不在这里累赘。
    在这里插入图片描述
    接着我们写出这个回调函数。回调函数的名字(mPictureCallback)可以随便改
    这个回调函数的意思就是在这摄像头执行拍照指令之后,程序会到这里来。
    这个onPictureTaken函数的参数data中保存的就是拍照形成的图像信息,只不过不是图形。
    所以我们要将data转换成图像,最后再在ImageView中显示这个图像。

    程序编到这里就差不多了,但是我们要是想调用系统的摄像头,就必须要用户同意,我们才能调用。
    所以我们需要向用户申请调用摄像头的权限。
    我们到AndroidManifest.xml中添加这样一行代码

    
    <uses-permission android:name="android.permission.CAMERA"/>
    

    就可以了
    图片如下
    在这里插入图片描述

    接下来就是代码了。
    首先是布局文件(activity_main.xml)中的代码

    <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="8dp"
                app:layout_constraintBottom_toBottomOf="parent"
                tools:layout_editor_absoluteX="8dp">
    
                    <SurfaceView
                        android:id="@+id/surfaceView"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_alignParentEnd="true"
                        android:layout_toEndOf="@+id/imageView"
                        tools:layout_editor_absoluteX="8dp"
                        tools:layout_editor_absoluteY="8dp" />
    
    
                    <Button
                        android:id="@+id/button"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentBottom="true"
                        android:layout_centerHorizontal="true"
                        android:text="拍照"
                        tools:layout_editor_absoluteX="160dp"
                        tools:layout_editor_absoluteY="447dp" />
    
                    <ImageView
                        android:id="@+id/imageView"
                        android:layout_width="0dp"
                        android:layout_height="0dp"
                        android:layout_alignParentStart="true"
                        android:layout_alignParentTop="true"
                        app:srcCompat="@android:color/background_light"
                        tools:layout_editor_absoluteX="8dp"
                        tools:layout_editor_absoluteY="8dp" />
            </RelativeLayout>
    

    布局文件中不能只有这些代码,这些代码只是替换掉原来<TextView*******/>的部分

    下面是MainActivity.java中的代码

    package com.example.wdx.myapplication;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.ImageFormat;
    import android.hardware.Camera;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback ,View.OnClickListener{
    
        private Button btn;//按钮的在代码中的体现,btn为名称可随意更改
        private SurfaceView mSurFaceView;
        private ImageView mImageView;
        private SurfaceHolder mSurfaceHolder;//用于获取SurfaceView的句柄,使其能被mCamera使用,以打开相机
        private Camera mCamera;//照相机的个体。
        private Camera.Parameters parameters;//相机的参数设置的变量
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //接下来的代码是将布局中的工具和代码中的个体对应起来,或者说联系起来
            btn = (Button) findViewById(R.id.button);
            mSurFaceView = (SurfaceView) findViewById(R.id.surfaceView);
            mImageView = (ImageView) findViewById(R.id.imageView);
            //在此之后就可以使用btn、mSurfaceView、mImageView来对布局中的工具进行操作了
            mImageView.setVisibility(View.GONE);//设置这个工具不可见
            btn.setText("拍照");//如代码所示,可以更改按钮的名字
            mSurfaceHolder = mSurFaceView.getHolder();//代码作用直译即可
            mSurfaceHolder.addCallback(this);
            btn.setOnClickListener(this);//设置按钮监听事件,这样当用户按按钮的时候就可以在单击事件函数里得到单击的信息了
        }
    
        //在Surface创建的时候执行这个函数
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mCamera = Camera.open();//打开摄像头(后摄像头),效果就是从此,mCamera就控制了手机的摄像头
            try{
                mCamera.setPreviewDisplay(mSurfaceHolder);//之后,mCamera从摄像机里获得的图像,就会实时的显示在mSurfaceView中。
                mCamera.setDisplayOrientation(90);//使你预览的画面呈现为正常的视觉画面,可是删除此行试试效果
                parameters = mCamera.getParameters();//将现在camera的参数设置保存到变量parameter中
                //接下来的代码是对mCamera参数的调整,或者说设置
                parameters.setPreviewSize(parameters.getSupportedPreviewSizes().get(0).width,parameters.getSupportedPreviewSizes().get(0).height);//设置预览的尺寸,通过此种方法可设置为最大预览尺寸(我觉得)
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);         //设置适合照片对焦
                parameters.setRotation(90);//跟mCamera.setDisplayOrientation(90);有类似的作用
                parameters.setPictureFormat(ImageFormat.JPEG);//设置得到的照片模式
    
                mCamera.setParameters(parameters);//这就是将我们改变的相机参数设置到相机里了
                mCamera.startPreview();//开始预览相机画面
    
            }catch (IOException e){//如果上面try中的代码有代码执行出错,就会来到这里
                e.printStackTrace();
                mCamera.release();//释放摄像头,避免发生一直占用摄像头的情况
                mCamera=null;//使mCamera为空,就是不代表任何东西。这也是保护代码
            }
        }
        //在Surface被改变的时候执行这个函数
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            //此处不填任何代码,因为本程序中不需要这个功能,但是这个函数不能删除
        }
        //在Surface销毁的时候执行这个函数
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();//停止预览,毕竟Surface都已经销毁了
            mCamera.release();
            mCamera=null;
        }
    
        //单击事件,这个函数收集所有的单击事件
        @Override
        public void onClick(View v) {
            if(v.getId()==R.id.button){//当用户单击的是button的时候执行下面的代码
                mCamera.autoFocus(null);//聚焦
                mCamera.takePicture(null,null,mPictureCallback);//开始照相,mPictureCallback为回调函数
            }
        }
        private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                mImageView.setVisibility(View.VISIBLE);//设置这个工具可见
                Bitmap btm = BitmapFactory.decodeByteArray(data, 0, data.length);//将照片数据变成图像
                mImageView.setImageBitmap(btm);//显示这个图像
            }
        };
    
    }
    
    

    最后是AndroidManifest.xml中的代码

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.wdx.myapplication">
        <uses-permission android:name="android.permission.CAMERA"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    可以在android:label="********",的双引号中更改标题栏中显示的信息。

    最后,在所有的都没什么问题的时候,就可以单击build,选择build apk
    在这里插入图片描述
    在apk创建完毕之后就会出现
    在这里插入图片描述
    单击蓝色字体Show in Explorer,就可以在文件夹里看到创建的apk了。

    最后,因为这个只是最简单的利用camera1制作的一个照相的app,所以只能进行一次性拍照,在拍完一次之后如果再按拍照按钮的话就会闪退,等等还有一些问题。所以大家只是借鉴就好。

    展开全文
  • 安卓开发手机相机(Camera)应用讲解之前我说段废话,当你选择了语言开发时,你就要永远的学习下去,没有终点,除非你选择转行,要不然你不能停止。 好了,我们开始进入讲解过程: 我之所以讲相机的原因是在...
  • 《零基础Android手机嵌入式开发实战课程(网吧计费系统、多功能播放器、驱动开发)》 课程讲师:老夫子  适合人群:初级 课时数量:174课时 用到技术:Bootloader开发、裸板开发 涉及项目:网吧计费系统、多功能...
  • 安卓手机如何设置默认相机应用?华为、小米、vivo、oppo手机,设置默认相机的操作步骤。安卓手机今日水印相机App1图中华为手机系统环境:EMUI9.1.0在手机桌面点击“设置”2点击“应用”3点击“默认应用”4点击“相机...
  • 安卓开发 手机相机程序,照片旋转处理.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 手机android play里面下载有照相功能的应用时, 会判断手机是否支持。不支持,不给予下载。 照相有几个步骤: 1. 声明权限 2. 使用Camera照相 3. 显示图片 1. 声明权限 在manifest里面声明使用Camera: ...
  • 安卓相机开发

    2019-02-06 22:37:30
    随着手机性能的提高,多媒体的应用越来越普遍,其中拍照,录像,美颜等都需要调用手机相机的功能。 相机采集和显示的经典例子是下面谷歌的开源实现,是比较好的入门学习资料: https://github.com/google/grafika ...
  • Android 水印相机开发

    千次阅读 2019-03-08 16:57:46
    水印相机是自定义相机的一种,实现方法有很多,我看了很多别人的做的很漂亮,我做的就很普通了,不过总算是实现了拍照加水印的功能。 我这边用到了SurfaceView,有人没用这个也做出来水印...相机功能由android.hardw...
  • Android相机开发那些坑

    2016-03-07 09:47:35
    最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸(1:1或3:4)的照片,并支持在拍摄出的照片上做贴纸相关的操作。由于之前没有接触过Android相机开发,所以在整个...
  • android模拟照相机

    2018-05-31 09:44:41
    android studio为开发工具设计的照相机模拟拍照功能的程序
  • android相机开发

    万次阅读 多人点赞 2013-08-20 22:32:06
    android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己写的相机。 我将分别演示两种方式的使用: 第一种:是使用Intent跳转到系统相机,action为:android.media.action.STILL_IMAGE_CAMERA 关键...
  • 安卓 相机 图片。一般人使用调用相机时调用TActionList的标准动作TTakePhotoFromCameraAction,但是这可能出错,像Android,必须先检查并可能请求权限,查看本代码后你就会明白。
  • Android相机开发

    千次阅读 2018-06-15 15:25:07
    基础相机开发中常用的APIpackage android.hardware.camera2 这个包中包含了主要的相机控制的API,可以用于在你的项目中进行拍照或者录像功能的实现Camera 这个类是早些版本驱动相机的APISurfaceView 用于相机预览的...
  • 非商业性使用-禁止演绎 4.0 国际》协议 https://blog.csdn.net/bluewindtalker/article/details/54563910相机开发现在有2个类,分别为android.hardware.camera2和android.hard...
  • android开发APP实现照相机功能

    千次阅读 2018-05-28 14:19:20
    Android SDK 中提供的面向硬件的特性特性描述android.hardware.Camera相机交互的类,可以截取照片、获取预览屏幕的图像,修改照相机操作的参数。android.hardware.SensorManager允许访问 Android 平台传感器的类。...
  • Android Camera 相机开发详解

    万次阅读 多人点赞 2016-07-25 16:38:52
    Android 5.0(SDK 21)中,Google使用Camera2...但是基于众所周知的原因,我们还必须基于 Android 4.+ 系统进行开发。本文介绍的是Camera接口开发及其使用方法,通过本文章,你将全面地学会Camera接口的开发流程。
  • Android相机开发实战

    万次阅读 多人点赞 2015-09-07 11:28:03
    开源分享二(Android相机开发实战教程) 上篇博文给大家分享了两个非常实用的项目功能模块,不知道大伙感觉如何?有木有一种臭袜子味扑鼻,酸爽的赶脚!!!贱笑贱笑了~ ~ OK!不扯淡了,言归正传。本文将主要为...
  • Android实战开发:自定义照相机

    千次阅读 2016-01-08 16:19:41
    参考资料: SurfaceView: ... android.hardware.Camera2: ...但由于Camera2类不向下兼容,而且目前安卓手机5.0以上的不多,所以我们还是使用过时的android.hardware.Camera。 关于Camera2类的详情,点这里: ...
  • 【copy from:Android Camera相机以及相机程序开发实例 】 拍照程序,是通过 Intent 调用 Android 系统提供的照相机程序实现的。 Android SDK 提供了直接操作移动设备摄像头的 android.hardware.Camera 类,通过该类...
  • 近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是通过自定义的方式来实现手机照相的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,395
精华内容 8,558
关键字:

安卓手机相机开发