android中几个小程序,打开照相机,自定义相机,设置固定大小的视频播放
2017-01-12 16:20
525 查看
下面是一个打开照相机的程序
MainActivity 类
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { Camera camera; SurfaceView sv; // CameraManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //以这种方法打开的 如果被占用,那么抛异常 sv = (SurfaceView) findViewById(R.id.sv); sv.getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { //6.0动态权限 if (Build.VERSION.SDK_INT >= 23) { //Manifest.permission.CAMERA //如果用户并没有同意该权限 if (checkSelfPermission(Manifest.permission.CAMERA) != PERMISSION_GRANTED) { //申请权限 requestPermissions(new String[]{Manifest.permission.CAMERA}, 100); } else { open(holder); } } else { open(holder); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //如果用户同意了我的权限 if (requestCode == 100 && grantResults[0] == PERMISSION_GRANTED) { open(sv.getHolder()); } } public void open(SurfaceHolder holder) { //获取摄像头 camera = Camera.open(); //默认方向是-90度倾斜 camera.setDisplayOrientation(90); try { camera.setPreviewDisplay(holder); // Camera.Parameters parameters = camera.getParameters(); // parameters.setPictureSize(720, 1080); // camera.setParameters(parameters); } catch (IOException e) { e.printStackTrace(); } camera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } public void paizhao(View v) { camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // synchronized (MainActivity.this.camera) { try { FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/cam.jpg"); fos.write(data); fos.flush(); fos.close(); camera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } // } }); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.lesson15_camera.MainActivity"> <SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:onClick="paizhao" android:text="拍照" /> </RelativeLayout>
manifest的注册
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
自定义相机,第一个位置是照相机
第一个位置是放照片相机的位置
MainActivity 类
public class MainActivity extends AppCompatActivity { GridView gv; List<File> fileList = new ArrayList<>(); @Override 1004a protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gv = (GridView) findViewById(R.id.gv); initData(); } private void initData() { new Thread() { @Override public void run() { fileList.clear(); fileList.addAll(FileUtils.getAllPicture()); //子线程操作UI runOnUiThread(new Runnable() { @Override public void run() { gv.setAdapter(adapter); adapter.notifyDataSetChanged(); } }); } }.start(); } private BaseAdapter adapter = new BaseAdapter() { @Override public int getCount() { return fileList.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { int width = getResources().getDisplayMetrics().widthPixels / 3; GridView.LayoutParams params = new GridView.LayoutParams(width, width); switch (getItemViewType(position)) { case 0: if (convertView == null || convertView instanceof ImageView) { convertView = View.inflate(getBaseContext(), R.layout.camera_layout, null); convertView.setLayoutParams(params); } MyCamera cam = (MyCamera) convertView.findViewById(R.id.cam); break; case 1: if (convertView == null || convertView instanceof MyCamera) { convertView = new ImageView(MainActivity.this); } ImageView iv = (ImageView) convertView; File file = fileList.get(position); iv.setImageURI(Uri.fromFile(file)); convertView.setLayoutParams(params); break; } return convertView; } @Override public int getItemViewType(int position) { return position == 0 ? 0 : 1; } @Override public int getViewTypeCount() { return 2; } }; }
MyCamera 类
public class MyCamera extends SurfaceView implements SurfaceHolder.Callback { static Camera camera; public MyCamera(Context context) { super(context); init(); } private void init() { getHolder().addCallback(this); } public MyCamera(Context context, AttributeSet attrs) { super(context, attrs); init(); } @Override public void surfaceCreated(final SurfaceHolder holder) { release(); open(holder); } private void open(SurfaceHolder holder) { camera = Camera.open(); try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); //模拟器需要设置 Camera.Parameters parameters = camera.getParameters(); parameters.setPictureSize(300, 300); camera.setParameters(parameters); camera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void start() { if (camera != null) camera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { release(); } public void release() { if (camera != null) { camera.stopPreview(); camera.release(); camera = null; } } }
camera_layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.example.camerademo.MyCamera android:id="@+id/myca" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.camerademo.MainActivity"> <GridView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/gv" android:numColumns="3"/> </RelativeLayout>
需要权限
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
设置一个固定大小的视频播放
固定视频需要放在res目录下新建的raw文件中
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { SurfaceView sv; MediaPlayer mp; MediaController mc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sv = (SurfaceView) findViewById(R.id.sv); mc = (MediaController) findViewById(R.id.mc); SurfaceHolder holder = sv.getHolder(); //设置监听 holder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { //播放视频 mp = MediaPlayer.create(this, R.raw.hd); mp.setDisplay(holder); mp.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mp != null) mp.release(); mp = null; } public void pause(View v) { if (mp.isPlaying()) mp.pause(); else mp.start(); } }
xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.mediaplayer_11_3.MainActivity"> <SurfaceView android:layout_width="300dp" android:layout_height="300dp" android:layout_centerInParent="true" android:id="@+id/sv"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" android:onClick="pause" android:layout_alignParentBottom="true" android:layout_centerInParent="true" /> </RelativeLayout>
相关文章推荐
- Android学习之路------自定义屏保程序判断当前系统有视频正在播放
- Android开发中遇到的问题(一)——自定义videoview设置视频大小,实现上下黑边
- android 播放视频时 有流畅 、高清、超清等几个类型,在播放参数设置里面 区别在哪里?
- 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条
- android4.0.3修改camera预览大小分辨率和视频播放分辨率大小
- Android 打开/播放电脑的音频/视频文件
- Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)
- Android程序中代码动态设置Textview文字的大小解决px转dp的问题
- android自定义View设置大小的方法
- android 设置录制视频的时长与大小限制,超时、超大小时自动停止
- android中的Mediaplayer------可以同时打开多个视频播放--------------
- android程序中 直接打开系统设置的锁定屏幕界面
- Android 利用发送Intent播放本地视频和网络视频(浏览器打开这个URL)
- android 自定义播放器播放视频
- ym——Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)
- PHP做视频网站,让程序自动实现视频格式转换、设置视频大小、生成视频缩略图
- Android 自定义对话框(Dialog)设置显示大小方向
- Android视频播放程序关键部分简要解析
- Android学习篇章48-VideoView视频播放-控制屏幕大小
- 设置Android自定义标题栏的背景色和字体的大小