zoukankan      html  css  js  c++  java
  • Camera学习,实现简单的相机App得到demo

    1、首先得加入权限,其中清单文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.mycamera"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
    	<uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.mycamera.MainActivity"
                android:label="@string/app_name" 
                android:screenOrientation="landscape"
                 >
                
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

      2、main_xml文件,

    android:layout_weight="0"是显示的权限,越大权限越小,这是线性布局里起效
    <LinearLayout
             xmlns:android="http://schemas.android.com/apk/res/android"
        	xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            tools:context="com.example.mycamera.MainActivity$PlaceholderFragment"
             >
        <SurfaceView
            android:layout_weight="100"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
           	android:id="@+id/camera"
    		 />
        <RelativeLayout 
            
            android:layout_weight="0"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            >
    	<Button 
    	    android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="拍照"
            android:layout_alignParentRight="true"
            android:id="@+id/pz"
            android:onClick="paizhao"
    	    />
    	<Button 
    	    android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="对焦"
            android:id="@+id/dj"
            android:layout_toLeftOf="@+id/pz"
            android:onClick="duijiao"
    	    />
    	</RelativeLayout>
    	</LinearLayout>
    

      3、实现代码,其中观看相机硬件参数的结果时候是密密麻麻的为了方便观看结果可以看我的这篇博客:http://www.cnblogs.com/bokeofzp/p/4743108.htm

      

     public class MainActivity extends Activity {
    
    		private SurfaceView sv;
    	    private SurfaceHolder holder;
    	    private Camera mCamera;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏
            setContentView(R.layout.activity_main);
            sv=(SurfaceView) findViewById(R.id.camera);
            holder=sv.getHolder();
            holder.setFixedSize(3264,2448);
            holder.addCallback(new MyCallback());
        }
    
        
        public void duijiao(View v)
        {
            //自动对焦
            mCamera.autoFocus(null);
             
        }
        public void paizhao(View v) throws IOException
        {
            //拍照
            mCamera.takePicture(null, null, new MyPictureCallback() );
        }
     
        class MyPictureCallback implements  PictureCallback
        {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
            	
            	
    //        	System.out.println("data"+data.length);
            	
                File images=new File(Environment.getExternalStorageDirectory()+"//TextLocation");
                FileOutputStream out=null;
                if(!images.exists())
    				images.mkdirs();
                Date date = new Date();  
                SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间  
                String filename = format.format(date) + ".jpg";
                File image=new File(images,filename);
                
                try {
                    out=new FileOutputStream(image);
                    out.write(data);
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "保存照片失败!", Toast.LENGTH_LONG).show();
                }
                finally
                {
                	camera.startPreview();
                }
            }
             
        }
         
         
    class MyCallback implements Callback
    {
     
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            //初始化相机
            mCamera=Camera.open(); 
            try {
                mCamera.setPreviewDisplay(holder);
            } catch (IOException e) {
                e.printStackTrace();
            }
            mCamera.startPreview();
        }
     
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
        	if (holder.getSurface() == null)
        	{          
        		// preview surface does not exist          
        		return;         } 
        	 mCamera.stopPreview();
    
         //可以将所有参数信息一行行显示,具体方法可以参见我的另外一篇博客:   http://www.cnblogs.com/bokeofzp/p/4743108.html
    //      System.out.println(mCamera.getParameters().flatten());
        	 Camera.Parameters parms=mCamera.getParameters();
        	 parms.setPictureFormat(ImageFormat.JPEG);//设置图片的格式
        	 int w=sv.getWidth();
        	 int h=sv.getHeight();
        	 
        	 List<Size> sizes2=parms.getSupportedPreviewSizes();
        	 for(Size s:sizes2)
        		 System.out.println(s.width+","+s.height);
        	 parms.setPreviewSize(1920,1088);//预览大小
        	 parms.setPictureSize(3264,2448);//设置照片的大小  
    //    	 Size size= parms.getPictureSize();
    //    	 Size size2= parms.getPreviewSize();
    //    	 System.out.println(size2.width);
        	 try {
        		 //一定要将属性值返回去,否则设置无效
        		 mCamera.setParameters(parms);
    		 mCamera.startPreview();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} 
            
        }
     
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mCamera.release();
            mCamera=null;
        }
         
    }
        
        
        
    
    }
    

      

      

      

  • 相关阅读:
    Java使用Preconditions.checkNotNull(.....)判空对象, 并处理可能的NullPointerException异常
    jdk1.8
    BigDecimal
    BIOS的启动原理学习--加载引导程序
    Linux系统想要切换到root用户时出现authentication failure
    Ubuntu Linux 操作系统与实验教程--Linux系统的基本组成
    Java中“==”和equals()的区别
    自己编写操作系统2--初始镜像编写以及VM启动
    关于Windows下子系统WSL的思考
    自己编写操作系统1--概述
  • 原文地址:https://www.cnblogs.com/bokeofzp/p/4743016.html
Copyright © 2011-2022 走看看