如何实现直播平台开发使用 Camera 拍照
随着信息时代的发展,直播在我们生活中也越来普遍化,我们也越来越愿意在直播平台中分享我们的日常生活,这同时促进了直播平台开发功能且不断更新,比如生活中遇到有趣的事情就拍照记录下来随之发到平台上去,怎么把照片发布到直播平台上去,这就需要使用 Camera 拍照功能。
Android直播平台开发中Camera的使用,简单点说就是拍照咯,无非两种:
1.调用系统自带相机拍照,然后获取拍照后的图片
2.要么自己写个拍照页面
本节我们来写两个简单的例子体验下Android直播平台开发的这两种情况~
1.直播平台开发时调用系统自带Carema
我们只需下面一席话语,即可调用系统相机,相机拍照后会返回一个intent给onActivityResult。 intent的extra部分包含一个编码过的Bitmap~
1 | Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);<br>startActivityForResult(it,Activity.DEFAULT_KEYS_DIALER);<br> //重写onActivityResult方法<br> @Override<br> protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br> if(requestCode == Activity.RESULT_OK){<br> Bundle bundle = data.getExtras();<br> Bitmap bitmap = (Bitmap) bundle.get("data");<br> img_show.setImageBitmap(bitmap);<br> }<br>} |
对了,拍完的图片是不会保存到本地的, 我们可以通过对直播平台开发把图片保存到我们的SD卡里,然后再显示,这样的图片会清晰很多, 嗯,我们写代码来试下~
//定义一个保存图片的File变量
private File currentImageFile = null;
//在按钮点击事件处写上这些东西,这些是在SD卡创建图片文件的:
1 | @Override <br> public void onClick(View v) {<br> File dir = new File(Environment.getExternalStorageDirectory(), "pictures" );<br> if (dir.exists()){<br> dir.mkdirs();<br> }<br> currentImageFile = new File(dir,System.currentTimeMillis() + ".jpg" );<br> if (!currentImageFile.exists()){<br> try {<br> currentImageFile.createNewFile();<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> }<br> Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);<br> it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(currentImageFile));<br> startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER);<br> }<br> //onActivityResult:<br> @Override<br> protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br> if (requestCode == Activity.DEFAULT_KEYS_DIALER) {<br> img_show.setImageURI(Uri.fromFile(currentImageFile));<br> }<br>} |
~调用系统自带Carema就是这么简单~
2.直播平台开发时自己写一个拍照页面
这里我们需要用一个SurfaceView作为我们的预览界面,使用起来同一非常简单!
直播平台开发代码实现:
布局代码:activity_main.xml:一个简单的surfaceView + Button
1 | <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" <br> android:layout_width= "match_parent" <br> android:layout_height= "match_parent" <br> android:orientation= "vertical" ><br> <SurfaceView<br> android:id= "@+id/sfv_preview" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:layout_weight= "1" /><br> <Button<br> android:id= "@+id/btn_take" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:text= "调用系统照相机" /><br></LinearLayout><br>MainActivity.java:<br> public class MainActivity extends AppCompatActivity {<br> private SurfaceView sfv_preview;<br> private Button btn_take;<br> private Camera camera = null ;<br> private SurfaceHolder.Callback cpHolderCallback = new SurfaceHolder.Callback() {<br> @Override <br> public void surfaceCreated(SurfaceHolder holder) {<br> startPreview();<br> }<br> @Override <br> public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {<br> }<br> @Override <br> public void surfaceDestroyed(SurfaceHolder holder) {<br> stopPreview();<br> }<br> };<br> @Override <br> protected void onCreate(Bundle savedInstanceState) {<br> super .onCreate(savedInstanceState);<br> setContentView(R.layout.activity_main);<br> bindViews();<br> }<br> private void bindViews() {<br> sfv_preview = (SurfaceView) findViewById(R.id.sfv_preview);<br> btn_take = (Button) findViewById(R.id.btn_take);<br> sfv_preview.getHolder().addCallback(cpHolderCallback);<br> btn_take.setOnClickListener( new View.OnClickListener() {<br> @Override <br> public void onClick(View v) {<br> camera.takePicture( null , null , new Camera.PictureCallback() {<br> @Override <br> public void onPictureTaken( byte [] data, Camera camera) {<br> String path = "" ;<br> if ((path = saveFile(data)) != null ) {<br> Intent it = new Intent(MainActivity. this , PreviewActivity. class );<br> it.putExtra( "path" , path);<br> startActivity(it);<br> } else {<br> Toast.makeText(MainActivity. this , "保存照片失败" , Toast.LENGTH_SHORT).show();<br> }<br> }<br> });<br> }<br> });<br> }<br> //保存临时文件的方法<br> private String saveFile( byte [] bytes){<br> try {<br> File file = File.createTempFile( "img" , "" );<br> FileOutputStream fos = new FileOutputStream(file);<br> fos.write(bytes);<br> fos.flush();<br> fos.close();<br> return file.getAbsolutePath();<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> return "" ;<br> }<br> //开始预览<br> private void startPreview(){<br> camera = Camera.open();<br> try {<br> camera.setPreviewDisplay(sfv_preview.getHolder());<br> camera.setDisplayOrientation( 90 ); //让相机旋转 90 度<br> camera.startPreview();<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> }<br> //停止预览<br> private void stopPreview() {<br> camera.stopPreview();<br> camera.release();<br> camera = null ;<br> }<br>}<br>最后是另外一个PreviewActivity.java,这里将图片显示到界面上而已~<br> /**<br> * Created by Jay on 2015/11/22 0022.<br> */ <br> public class PreviewActivity extends AppCompatActivity {<br> @Override <br> public void onCreate(Bundle savedInstanceState) {<br> super .onCreate(savedInstanceState);<br> ImageView img = new ImageView( this );<br> String path = getIntent().getStringExtra( "path" );<br> if (path != null ){<br> img.setImageURI(Uri.fromFile( new File(path)));<br> }<br> setContentView(img);<br> }<br>} |
嗯,都非常简单哈,别忘了加上权限:
1 | <uses-permission android:name= "android.permission.CAMERA" /><br><uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> |
另外,有一点要说的就是假如carema没有释放掉的话,那么下次调用carema就会报错, 报错内容是:java.lang.RuntimeException:fail to connect to camera service 所以,需要对Carema进行release();假如一直报上面的错误,请重启手机~
以上就是 如何实现直播平台开发使用 Camera 拍照,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-08-08 直播源码开发,点击扫描跳转到扫码页面
2022-08-08 直播平台怎么搭建,设置状态栏颜色、沉浸式状态栏
2022-08-08 直播电商平台开发,点击查看更多显示所有内容