安卓怎么打开相机权限

安卓怎么打开相机权限,第1张

网页调用摄像头,很多浏览器不支持的。思路是:调用摄像头拍照后,获取到的地址,或者文件二进制内容,异步传输到服务器。上传也有两种方法吧,一种是用H5的file类型input标签,通过表单传的。一种是通过js把文件转成base64编码格式传输的。

(1)CameraActivityjava

package comcameratest; import androidappActivity;import androidcontentpmActivityInfo;import androidosBundle;import androidviewWindow;import androidviewWindowManager;import androidwidgetRelativeLayout; public class CameraActivity extends Activity {    private CameraView view;    public void onCreate(Bundle savedInstanceState) {        superonCreate(savedInstanceState);         getWindow()clearFlags(                WindowManagerLayoutParamsFLAG_FORCE_NOT_FULLSCREEN);        getWindow()addFlags(WindowManagerLayoutParamsFLAG_LAYOUT_IN_SCREEN);        requestWindowFeature(WindowFEATURE_NO_TITLE);// 设置横屏模式以及全屏模式         view = new CameraView(this);// 通过一个surfaceview的view来实现拍照        viewsetId(1);        view = new CameraView(this, this);        setContentView(Rlayoutcamera_layout);        RelativeLayout relative = (RelativeLayout) thisfindViewById(Ridly);        RelativeLayoutLayoutParams Layout = new RelativeLayoutLayoutParams(3, 3);// 设置surfaceview使其满足需求无法观看预览        LayoutaddRule(RelativeLayoutALIGN_PARENT_BOTTOM, 1);        LayoutaddRule(RelativeLayoutALIGN_PARENT_RIGHT, 1);         relativeaddView(view, Layout);     } }   (2) CameraViewjava package comcameratest; import javaioFile;import javaioFileOutputStream;import javaioIOException;import javatextSimpleDateFormat;import javautilDate;import androidappActivity;import androidcontentContext;import androidgraphicsBitmap;import androidgraphicsBitmapFactory;import androidgraphicsPoint;import androidgraphicsPointF;import androidhardwareCamera;import androidhardwareCameraAutoFocusCallback;import androidhardwareCameraShutterCallback;import androidmediaAudioManager;import androidmediaFaceDetector;import androidmediaFaceDetectorFace;import androidosEnvironment;import androidosHandler; import androidviewSurfaceHolder;import androidviewSurfaceView;import androidwidgetToast; public class CameraView extends SurfaceView implements SurfaceHolderCallback,        CameraPictureCallback{     private SurfaceHolder holder;    private Camera camera;    private CameraParameters parameters;    private Activity act;    private Handler handler = new Handler();    private Context context;    private SurfaceView surfaceView;    private AudioManager audio;    private int current;     public CameraView(Context context) {        super(context);         surfaceView = this;        audio = (AudioManager) contextgetSystemService(ContextAUDIO_SERVICE);        final int current = audiogetRingerMode();        audiosetRingerMode(AudioManagerRINGER_MODE_SILENT);        thiscontext = context;        holder = getHolder();// 生成Surface Holder        holderaddCallback(this);        holdersetType(SurfaceHolderSURFACE_TYPE_PUSH_BUFFERS);// 指定Push Buffer         handlerpostDelayed(new Runnable() {             @Override            public void run() {                if (camera == null) {                    handlerpostDelayed(this, 1 1000);// 由于启动camera需要时间,在此让其等两秒再进行聚焦知道camera不为空                } else {                    cameraautoFocus(new AutoFocusCallback() {                        @Override                        public void onAutoFocus(boolean success, Camera camera) {                            if (success) {                                cameratakePicture(new ShutterCallback() {// 如果聚焦成功则进行拍照                                            @Override                                            public void onShutter() {                                            }                                        }, null, CameraViewthis);                            } else {                            }                        }                    });                }            }        }, 2 1000);    }     public CameraView(Context context, Activity act) {// 在此定义一个构造方法用于拍照过后把CameraActivity给finish掉        this(context);        thisact = act;    }     @Override    public void surfaceCreated(final SurfaceHolder holder) {        // TODO Auto-generated method stub         camera = Cameraopen();// 摄像头的初始化        handlerpostDelayed(new Runnable() {             @Override            public void run() {                if (holder != null) {                    try {                        camerasetPreviewDisplay(holder);                    } catch (IOException e) {                        // TODO Auto-generated catch block                        eprintStackTrace();                    }                } else {                    handlerpostDelayed(this, 1 1000);                }            }        }, 2 1000);    }     @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,            int height) {        // TODO Auto-generated method stub         parameters = cameragetParameters();        camerasetParameters(parameters);// 设置参数        camerastartPreview();// 开始预览    }     @Override    public void surfaceDestroyed(SurfaceHolder holder) {        // TODO Auto-generated method stub     }     public void onPictureTaken(byte[] data, Camera camera) {// 拍摄完成后保存照片         try {             Date date = new Date();            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");            String time = formatformat(date);             //在SD卡上创建文件夹            File file = new File(EnvironmentgetExternalStorageDirectory()                    + "/myCamera/pic");            if (!fileexists()) {                 filemkdirs();            }             String path = EnvironmentgetExternalStorageDirectory()                    + "/myCamera/pic/" + time + "jpg";            data2file(data, path);            camerasetPreviewCallback(null);            camerastopPreview();            camerarelease();            camera = null;            holderremoveCallback(CameraViewthis);            audiosetRingerMode(current);            actfinish();            //uploadFile(path);         } catch (Exception e) {         }     }     private void data2file(byte[] w, String fileName) throws Exception {// 将二进制数据转换为文件的函数        FileOutputStream out = null;        try {            out = new FileOutputStream(fileName);            outwrite(w);            outclose();        } catch (Exception e) {            if (out != null)                outclose();            throw e;        }    }//  private void uploadFile(String filePath)// 拍照过后上传文件到服务器//  {//  } }

先打开手机,然后在手机的设置里面去找相机的设置,然后在拍照的功能下也可以在选项里面找到更换摄像头的选项, 一般都是按左键出来选单,其次在在手机菜单里面勾选展开详细即可调到后置摄像头。

如何拍照更好看:

1对焦:测光首先面对一个复杂的人像环境我们应该对焦在哪里呢?非常简单就是面部,手机在对焦的同时也在测光当我们对焦至面部最大的好处就是除了焦点,测光也是非常准确的,同时如果光线不是特别强烈建议大家吧曝光补偿稍稍调高这样人的皮肤会更加白皙。

2高光比:如果光照太强的话那就要注意光纤的位置了,如果直直的打到脸上脖子的部分就会很黑这样的高光比环境并不好看,如果真的不可避免其实一顶漂亮的帽子或者俏皮的用双手遮住前额就能很好的解决,画面也会更加丰富。高光比同样会出现在侧脸同样要避免。

3睁眼:另外心灵的窗户要全开,无论是正面我们不解释,侧脸哪怕是剪影照片一个张开的眼睛会让觉得生机勃勃。

4露齿:另外女孩子只要牙齿比较平整的话其实是非常建议露出你的牙齿,笑露齿会显得你更加开朗,轻露牙齿则会让人觉得非常好亲切,没有距离感。

5肩膀:说完牙齿我们说说肩膀,其实肩膀往往使大家容易忽略的高低肩在平时并不好看,但是在照片中高低错落的肩膀会非常的有生活气息。

6手指:然后我们再说说另一个被忽略的手指,拍照时千万不要把你的手指藏起来,插兜也好,缕发也好,手指会给我们一定的延伸感,非常好看。

7顶天立地:说完了这些再说一下摄像师应该注意的,尤其是单身男士这是知识点,首先拍半身橡。头部上方不要流出太多,会有一种压迫感,全身像脚要接近画底部,知道这点你会发现你的照片一下从众多旅游照里脱颖而出,如果你能说服女神双腿交叉站的话,你的女神又会瞬间增高两厘米。

8剪裁:如果是整个面部特写的话一个良好的剪裁更能凸显人物特点,不妨尝试下手狠一点或许你能获得一个更加有质感的女神,毕竟此刻背景并不重要。

9微风拂面:其实人物外拍最美好的事情就是在室外环境中不仅有自然光还有清风,一个被风吹动的照片将是非常吸引人的。

微信内置浏览器,和一些主流浏览器支持调用摄像头,但也有很多不支持调用摄像头,仅支持相册。
如果是WebView中,就需要客户端支持了,android和ios的权限也是问题。

formData 简介

简单的说就是:通过formData,我们可以用ajax方式来发送表单数据;以前上传是需要用form表单提交的。

我们知道浏览器默认显示的文件上传按钮是很丑的,通常UI都会对上传按钮进行设计。有以下几种方案来写样式。

弊端:

通过ref获取上传按钮。

ref方式

eventtarget方式

坑:

FileReader 简介

通过 readAsDataURL() ,在读取 *** 作完成后,result属性中将包含一个data:URL格式的字符串以表示所读取文件的内容。

base64字符串

兼容性

我在safari中测试,发现是支持的。

URLcreateObjectURL 简介

通过URLcreateObjectURL()创建一个URL对象,这个URL对象表示指定的file对象或Blob对象。

兼容性

张鑫旭的文章: HTML5 file API加canvas实现前端JS压缩并上传

张鑫旭的文章: 理解DOMString、Document、FormData、Blob、File、ArrayBuffer数据类型

使用Camera API
张鑫旭


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13353258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存