如何实现直播平台开发使用 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(nullnullnew 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 拍照,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2022-08-08 直播源码开发,点击扫描跳转到扫码页面
2022-08-08 直播平台怎么搭建,设置状态栏颜色、沉浸式状态栏
2022-08-08 直播电商平台开发,点击查看更多显示所有内容
点击右上角即可分享
微信分享提示