android中几个小程序,打开照相机,自定义相机,设置固定大小的视频播放
来源:互联网 发布:西北工业大学软件学院 编辑:程序博客网 时间:2024/04/19 09:14
下面是一个打开照相机的程序
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 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>
1 0
- android中几个小程序,打开照相机,自定义相机,设置固定大小的视频播放
- iOS之打开照相机拍照或者录像/打开手机的相册或者视频/视频压缩/自定义相机界面/照片或视频保存到相册
- android 设置固定大小的图片
- android打开照相机的方法
- Android中自定义VideoView视频播放器
- Android开发中遇到的问题(一)——自定义videoview设置视频大小,实现上下黑边
- Android自定义相机,切换前后摄像头,照相机拍照
- Android 设置AlertDialog固定大小
- Android在程序中播放本地视频
- android中打开固定的网页
- android中打开相机、打开相册进行图片的获取
- Qt中设置窗体固定大小的方法
- Android播放照相机声音
- MFC 设置程序固定窗口大小
- Android 照相机打开方法
- Android中照相机的使用
- Android 多媒体——音频播放录制、视频播放、相机
- 几个不错的Android开源音视频播放器
- 【认证】【芬兰】Cable HD Ready
- 逆向工程工具
- Mac OS 下手动编译静态库及Xcode中使用该静态库的例子(一)
- Android软件版本更新流程梳理以及Demo
- GBK与unicode转换
- android中几个小程序,打开照相机,自定义相机,设置固定大小的视频播放
- 傻傻分不清gulp和webpack以及nodejs 和 npm的
- Hive 操作数据库语句总结
- uploadify上传插件
- Linux下编译ffmpeg和x264支持的opencv
- MATLAB批量注释及撤销的办法
- python从零开始写爬虫(4)-- 整合代码
- IIS服务配置常见错误
- wxPython常用控件--wx.Grid,wx.ListBox,wx.ListCtrl,wx.TreeCtrl