调用android摄像头_android studio 调用的网页需要调用系统摄像头 - CSDN
  • Android 调用前置摄像头
                   

    转自:http://www.cnblogs.com/stay/archive/2011/06/24/2089129.html

    首先,鄙人要发泄下对Android小小的不满,为神马2.3才有api来支持front Camera ,为神马2.3之前的版本也会有前置摄像头,为神马每个厂商的调用前置摄像头的方式都不一样。尼玛同样是写程序,至于搞那么多不同版本不同兼容性问题么。生物识别技术你们伤不起啊!!!GOOGLE 您神马时候才能统一啊!!!别折磨我们这群蛋疼的码农了。该死的魂淡厂商们,你们大致统一一下行不行,坑爹的。

    if(model.equals(SUMSUNG&HTC&MOTO)){system.exit(0)}//支持山寨。

    先说如何录频吧。最简单的,调用MediaRecorder,最好开个子线程去写:

    这里网上有很多帖子都说,有bug,问题出在编码上,因为每个厂商支持的视频编码有点差异,所以别指望同一个代码能支持所有的手机。我用H264测试了十部手机,

    9个通过,1个坑爹的HTC 野火不支持。所以还是使用DEFAULT吧。MediaRecorder.VideoEncoder.DEFAULT

     Runnable run = new Runnable() {
      public void run() {
       try {
        myRecAudioFile = new File(Environment.getExternalStorageDirectory(), "video.mp4");// 创建临时文件
        if (myRecAudioFile.exists()) {
         myRecAudioFile.delete();
        }
        myRecAudioFile.createNewFile();
        recorder.reset();
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 视频源
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 录音源为麦克风
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 输出格式为mp4
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);// 视频编码
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 音频编码
        recorder.setVideoFrameRate(15);// 视频帧频率
        recorder.setVideoSize(320, 240);// 视频尺寸
        recorder.setPreviewDisplay(mSurfaceHolder.getSurface());// 预览
        // recorder.setMaxDuration(10000);// 最大期限
        recorder.setOutputFile(myRecAudioFile.getAbsolutePath());// 保存路径
        recorder.prepare();
        recorder.start();
        mHandler.sendEmptyMessageDelayed(1, 10000);
       } catch (Exception e) {
        stop(true);
       }
      }
     };

    现在来说前置摄像的问题

    2.3的api调用前置非常easy

    Camera android.hardware.Camera.open(int cameraId)

    Creates a new Camera object to access a particular hardware camera.

    cameraId the hardware camera to access, between 0 and getNumberOfCameras()-1.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
       for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {//这就是前置摄像头,亲。
         c = Camera.open(i);
        }
       }
      }
      if (c == null) {
       c = Camera.open();
      }

      c.unlock();//注意,要在MediaRecorder设置参数之前就调用unlock来获得camera的控制权。camera是单例的嘛。如果不调用,程序就挂
      recorder.setCamera(c);

    void android.hardware.Camera.unlock()

    Unlocks the camera to allow another process to access it. Normally, the camera is locked to the process with an active Camera object until release() is called. To allow rapid handoff between processes, you can call this method to release the camera temporarily for another process to use; once the other process is done you can call reconnect() to reclaim the camera.

    This must be done before calling android.media.MediaRecorder.setCamera(Camera).

    If you are not recording video, you probably do not need this method.

    这样就大功告成了。最后还有要注意的地方,就是当你停止拍摄或程序down掉的时候,要调用camera.lock()来释放camera的控制权,否则就不能再开启camera。知道抛异常。

    private void stop(boolean force) {
      if (!force) {
       recorder.stop();
      }
      recorder.reset();
      recorder.release();
      recorder = null;
      if (c != null) {
       c.lock();
       c.release();
       c = null;
      }
      setResult(force ? Activity.RESULT_CANCELED : Activity.RESULT_OK);

    //还记得,调用系统的camera来拍照时,intent里会返回文件的uri。你也可以这样做   intent.setData(Uri.fromFile(tempFile))
      this.finish();
     }

    下面再来说2.3之前的如何调用前置的。公司只有HTC野火和SUMSUNG I9000有前置,所以我只研究了这两个,有其他brand的可以用类似的方法去做,如果你弄出来了,请告诉我,mark下

    debug还是比较有趣的事情,我是指能成功的debug的话。。。。。

    测试这两个手机的时候我一行一行的看log。眼睛都花了,一遍咒骂宏达电和三星。

    06-23 17:49:05.058: WARN/CameraService(2374): getParameters(AppShutterSound=0;anti-shake=0;antibanding=auto;antibanding-values=auto,50hz,60hz,off;beauty-shot=0;blur=0;camera-id=1;chk_dataline=0;contrast=2;contrast-max=4;contrast-min=0;effect=none;effect-values=none,mono,negative,sepia;exposure-compensation=0;exposure-compensation-step=0.5;focal-length=3.79;focus-mode=auto;focus-mode-values=auto,macro;horizontal-view-angle=51.2;iso=auto;jpeg-quality=100;jpeg-thumbnail-height=120;jpeg-thumbnail-quality=100;jpeg-thumbnail-size-values=160x120,0x0;jpeg-thumbnail-width=160;max-exposure-compensation=4;max-zoom=30;metering=center;min-exposure-compensation=-4;picture-format=jpeg;picture-format-values=jpeg;picture-size=2560x1920;picture-size-values=2560x1920,2048x1536,1600x1200,640x480,2560x1536,2048x1232,1600x960,800x480;preview-format=yuv420sp;preview-format-values=yuv420sp;preview-frame-rate=30;preview-frame-rate-values=15,30;preview-size=640x480;preview-size-values=320x240,640x480,800x480;rotation=0;saturation=2;saturation-max=4;saturation-min=0;scene-mode=au

    这是三星的Camera.Parameters         你觉得哪个是设置前置摄像头的么    camera-id=1   bingo   就是它了。

    //  Parameters parameters = c.getParameters();
    //  parameters.set("camera-id",2);//sumsung 2.3以前的手机     我的I9000成功设置成前置的了。

    06-23 18:14:50.697: DEBUG/CameraService(1622): getParameters(Make=HTC;antibanding=auto;antibanding-values=auto,50hz,60hz;brightness=0;brightness-def=0;brightness-max=20;brightness-min=-20;contrast=0;contrast-def=0;contrast-max=100;contrast-min=-100;device=;device-list=/dev/video0,/dev/video1,/dev/video2;effect=none;effect-values=none,mono,negative,sepia,aqua;exposure-compensation=0;exposure-compensation-step=0;fnumber=3.5;focal-length=2.76;focus-mode=auto;focus-mode-values=auto;gps-mapdatum=WGS 84;horizontal-view-angle=54;iso=auto;jpeg-quality=85;jpeg-thumbnail-height=240;jpeg-thumbnail-size-values=320x240,0x0;jpeg-thumbnail-width=320;max-exposure-compensation=0;max-zoom=10;meter-mode=meter-average;min-exposure-compensation=0;models=A3360;picture-format=jpeg;picture-format-values=jpeg;picture-size=2048x1536;picture-size-values=2048x1536,1600x1200,1280x1024,1280x960,1024x768,800x600,640x480,384x288,352x288,320x240,176x144;preview-format=yuv420sp;preview-format-values=yuv420sp;preview-frame-rate=15;preview-frame-rate-values=30,15;preview-size=320x240;previ

    好了,这是宏达电的,你猜哪个是?   不好意思,木有这个参数。当时我就郁闷了。Android程序员你们都伤不起啊。一堆的兼容性问题。尼玛你们来试试。

    肿么办,好吧,去看系统自带的Camera吧,如果你懂得观察,还是比较有意思的。野火的后置摄像头叫  (主)   你们有这个机器的可以自己测试下。

    06-23 18:14:50.716: DEBUG/CameraService(1622): setParameters: video_input= main(有意思吧)

    debug吧,坑爹的叫video_input    尼玛弄不一样的key有意思么,搞这么混乱让人肿么活。人家做爱疯的,从底层自己写上来,一遍就ok啦。有木有。我们有一大堆的api,半小时就能写出来的功能,debug就要几天。有木有!!!

    你再试试吧系统的Camera切换成副摄像头叫什么。。。Secondary。有木有!!!

    好吧。video_input= Secondary    去试吧。依旧不行。。。S小写。尼玛伤不起啊

    //  Parameters parameters = c.getParameters();

    //  parameters.set("camera-id",2);//sumsung 2.3以前的手机  前置

    //  parameters.set("camera-id",1);//sumsung 2.3以前的手机  后置

    //  parameters.set("video_input","secondary");//htc2.3以前的手机  前置

    //  parameters.set("video_input","main");//htc2.3以前的手机   后置

    //  c.setParameters(parameters);

    ok,都这里就全部结束了。蛋疼的debug。蛋疼的Android。蛋疼的人生。码农你们伤不起啊!!!!


               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • public class ControlFragment extends BaseFragment { private static ProgressWebView webView; private WebSettings mSettings; private String capturePath; private String cameraId; ...

    public class ControlFragment extends BaseFragment {
        private static ProgressWebView webView;
        private WebSettings mSettings;
        private String capturePath;
        private String cameraId;
        private String type = null;
        public final int TRYPLAY = 99;// 拍照
        public final int DIAOYONG = 89;// 直接调用
        public final int FILECHOOSER_RESULTCODE = 11;
        public final int REQ_CAMERA = 12;
        public final int REQ_CHOOSE = 13;
        private final int SELECT_RESULT_CODE = 6;
        public final int NONE = 0;
        private final int RESULT_OK = 0;
        private File picture;
        private ValueCallback<Uri> mUploadMessage;
        private Uri result;
        String compressPath = "";
        String imagePaths;

        @Override
        protected int getContentResId() {
        
        return R.layout.fragment_web;
        }

        @Override
        protected void onFindView(View rootView) {
        super.onFindView(rootView);
        webView = (ProgressWebView) rootView.findViewById(R.id.webview);
        mSettings = webView.getSettings();
        // WebView先不要自动加载图片
        mSettings.setJavaScriptEnabled(true);
        mSettings.setBuiltInZoomControls(true);
        mSettings.setSupportZoom(true);
        mSettings
            .setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        mSettings.setUseWideViewPort(true);
        mSettings.setGeolocationEnabled(true);
        mSettings.setDomStorageEnabled(true);
        mSettings.setAppCacheMaxSize(1024 * 1024 * 8);

        webView.requestFocus();
        webView.setScrollBarStyle(0);
        webView.addJavascriptInterface(new WebUtils(), "JavaScriptInterface");
        // webView.setChromeClient(new myWebChromeClient());
        webView.setWebChromeClient(new myWebChromeClient());
        webView.setWebViewClient(new MyWebClient(getActivity()));
        webView.loadUrl(setloadUrl());

        }

        /**
         * @auther xt 回调结果
         * @date 2016年3月29日09:49:26
         * @param requestCode
         * @param resultCode
         * @param data
         */
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (null == mUploadMessage)
            return;
        Uri uri = null;
        if (requestCode == REQ_CAMERA) {
            afterOpenCamera();
            String media;
            try {
            media = MediaStore.Images.Media.insertImage(getActivity()
                .getContentResolver(), imagePaths, "", "");
            result = Uri.parse(media);
            } catch (FileNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
            }

            uri = result;
            mUploadMessage.onReceiveValue(uri);
            mUploadMessage = null;
        } else if (requestCode == REQ_CHOOSE) {
            if (data != null) {
            uri = afterChosePic(data);
            mUploadMessage.onReceiveValue(uri);
            mUploadMessage = null;
            } else {
            mUploadMessage.onReceiveValue(null);
            mUploadMessage = null;
            }

        }
        if (resultCode == NONE) {
            // mUploadMessage = null;
            // return;
        }
        if (requestCode == TRYPLAY) {
            // 设置文件保存路径这里放在跟目录下
            picture = new File(Environment.getExternalStorageDirectory()
                + "/temp.jpg");
            File extras = picture;
            if (extras != null) {
            String picName = bitmapToBase64(ratio(
                Environment.getExternalStorageDirectory() + "/temp.jpg",
                200f, 200f));
            String pictureId = "$('#'+'" + cameraId + "').attr('src', '"
                + picName + "');";
            webView.loadUrl("javascript:" + pictureId);
            }
            // 读取相册缩放图片
        }
        if (requestCode == SELECT_RESULT_CODE) {
            String picPathString = null;
            // Uri uri = data.getData();
            Cursor cursor = getActivity().getContentResolver().query(uri, null,
                null, null, null);
            if (cursor == null) {
            picPathString = uri.getPath();
            } else {
            cursor.moveToFirst();
            String imgPath = cursor.getString(1);
            picPathString = imgPath;
            }
            String picName = bitmapToBase64(ratio(picPathString, 200f, 200f));
            // upCameraApi(picPathString);
        }
        if (requestCode == DIAOYONG) {
            if (null == mUploadMessage) {
            return;
            }
            if (mUploadMessage != null) {
            if (data != null) {
                mUploadMessage.onReceiveValue(data.getData());
                mUploadMessage = null;
            } else {
                mUploadMessage.onReceiveValue(null);
                mUploadMessage = null;
            }

            } else {
            mUploadMessage.onReceiveValue(null);
            mUploadMessage = null;
            }
        }

        }

        /**
         * @auther xietian 弹相关的dialog
         * @date 2016年3月29日09:49:26
         * @param
         * @return void
         */
        public void showImagePickDialog() {

        String title = "获取图片方式";

        String[] choices = new String[] { "拍照", "相册" };

        new AlertDialog.Builder(getActivity()).setTitle(title)

        .setItems(choices, new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

            dialog.dismiss();
            switch (which) {
            case 0:
                openCarcme();
                break;

            case 1:
                chosePic();
                break;
            default:
                mUploadMessage = null;
                break;

            }
            compressPath = Environment.getExternalStorageDirectory()
                .getPath() + "/fuiou_wmp/temp";
            new File(compressPath).mkdirs();
            compressPath = compressPath + File.separator + "compress.jpg";

            }

        }).setNegativeButton("返回", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

            dialog.dismiss();
            switch (which) {
            default:
                mUploadMessage.onReceiveValue(null);
                mUploadMessage = null;
                break;

            }
            compressPath = Environment.getExternalStorageDirectory()
                .getPath() + "/fuiou_wmp/temp";
            new File(compressPath).mkdirs();
            compressPath = compressPath + File.separator + "compress.jpg";

            }

        }).setCancelable(false).show();
        }

        Uri cameraUri;
        private String mediaS;
        private String mediaStr;

        /**
         * @auther xt 打开照相机
         * @date 2016年5月12日
         * @param
         * @return void
         */
        private void openCarcme() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        imagePaths = Environment.getExternalStorageDirectory().getPath()
            + "/fuiou_wmp/temp/" + (System.currentTimeMillis() + ".jpg");
        // // 必须确保文件夹路径存在,否则拍照后无法完成回调
        // File vFile = new File(imagePaths);
        // if (!vFile.exists()) {
        // File vDirPath = vFile.getParentFile();
        // vDirPath.mkdirs();
        // } else {
        // if (vFile.exists()) {
        // vFile.delete();
        // }
        // }
        //
        // cameraUri = Uri.fromFile(vFile);
        // intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
        // startActivityForResult(intent, REQ_CAMERA);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
            Environment.getExternalStorageDirectory(), "/fuiou_wmp/temp/"
                + (System.currentTimeMillis() + ".jpg"))));
        getRootFragment().startActivityForResult(
            Intent.createChooser(intent, "File Chooser"), REQ_CAMERA);
        }

        /**
         * @auther xt 处理拍照结束后
         * @date 2016年5月12日
         * @param
         * @return void
         */
        private void afterOpenCamera() {
        File f = new File(imagePaths);
        addImageGallery(f);
        // File newFile = FileUtils.compressFile(f.getPath(), compressPath);
        }

        /**
         * 解决拍照后在相册中找不到的问题
         *
         * @auther xt
         * @date 2016年5月12日
         * @param
         * @return void
         */
        private void addImageGallery(File file) {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        getActivity().getContentResolver().insert(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        }

        /**
         * 本地相册选择图片
         *
         * @auther xt
         * @date 2016年5月12日
         * @param
         */
        private void chosePic() {
        FileUtils.delFile(compressPath);
        Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"
        String IMAGE_UNSPECIFIED = "image/*";
        innerIntent.setType(IMAGE_UNSPECIFIED); // 查看类型
        Intent wrapperIntent = Intent.createChooser(innerIntent, null);
        // startActivityForResult(wrapperIntent, REQ_CHOOSE);
        getRootFragment()
            .startActivityForResult(
                Intent.createChooser(wrapperIntent, "File Chooser"),
                REQ_CHOOSE);
        }

        /**
         * 选择照片后结束
         *
         * @auther xt
         * @date 2016年5月12日
         * @param
         */
        private Uri afterChosePic(Intent data) {

        // 获取图片的路径:
        String[] proj = { MediaStore.Images.Media.DATA };
        // 好像是android多媒体数据库的封装接口,具体的看Android文档
        @SuppressWarnings("deprecation")
        Cursor cursor = getActivity().managedQuery(data.getData(), proj, null,
            null, null);
        if (cursor == null) {
            // Toast.makeText(this,
            // "上传的图片仅支持png或jpg格式",Toast.LENGTH_SHORT).show();
            return null;
        }
        // 按我个人理解 这个是获得用户选择的图片的索引值
        int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        // 将光标移至开头 ,这个很重要,不小心很容易引起越界
        cursor.moveToFirst();
        // 最后根据索引值获取图片路径
        String path = cursor.getString(column_index);
        if (path != null
            && (path.endsWith(".png") || path.endsWith(".PNG")
                || path.endsWith(".jpg") || path.endsWith(".JPG"))) {
            try {
            mediaStr = MediaStore.Images.Media.insertImage(getActivity()
                .getContentResolver(), path, "", "");
            } catch (FileNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
            }
            result = Uri.parse(mediaStr);

            // File newFile = FileUtils.compressFile(path, compressPath);
            return result;
        } else {
            // Toast.makeText(this,
            // "上传的图片仅支持png或jpg格式",Toast.LENGTH_SHORT).show();
        }
        return null;
        }

        /**
         *
         * @author xt 重写webchromeclient
         * @date 2016年5月12日
         * @param
         * @return void
         *
         */
        protected class myWebChromeClient extends WebChromeClient {
        // For Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg,
            String acceptType) {
            if (mUploadMessage != null)
            return;
            mUploadMessage = uploadMsg;
            showImagePickDialog();
        }

        // For Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
            if (mUploadMessage != null)
            return;
            mUploadMessage = uploadMsg;
            showImagePickDialog();
        }

        // For Android 4.1
        public void openFileChooser(ValueCallback<Uri> uploadMsg,
            String acceptType, String capture) {
            if (mUploadMessage != null)
            return;
            mUploadMessage = uploadMsg;
            showImagePickDialog();
        }
        }

        public static void updateUrl() {
        webView.reload();
        }

        public String setloadUrl() {
        String url = ApiConstant.BASE_HTML + "control/control.html";
        return url;
        }

        public class WebUtils {
        private Context context;

        public WebUtils() {
        }

        public WebUtils(Context context) {
            this.context = context;
        }

        /**
         * 关闭网页 cjh 2015年12月20日
         */
        public void finishHtml() {
            ((Activity) context).finish();
        }

        /**
         * 需要传workId,serviceSerialId,standardServiceName cjh 2015年12月20日
         *
         * @return
         */
        public String ThreeParams() {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("workId", PreferenceUtils.getWorkId());
            map.put("serviceSerialId", PreferenceUtils.getSerciceserialId());
            map.put("standardServiceName", PreferenceUtils.getStandarName());
            return GsonUtils.get().objectToJson(map);
        }

        /**
         * 传递 workId cjh 2015年12月20日
         *
         * @param workid
         * @return
         */
        public String WorkIdParams() {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("workId", PreferenceUtils.getWorkId());
            return GsonUtils.get().objectToJson(map);
        }

        /**
         * 需要传workId serviceSerialId cjh 2015年12月20日
         *
         * @return
         */
        public String serviceSerialIdParams() {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("workId", PreferenceUtils.getWorkId());
            map.put("serviceSerialId", PreferenceUtils.getSerciceserialId());
            return GsonUtils.get().objectToJson(map);
        }

        /**
         * 创建订单成功之后跳转到主页 cjh 2015年12月23日
         */
        public void CreateOrderSucc() {
            Intent intent = new Intent(context, MainActivity.class);
            ((Activity) context).startActivity(intent);
            ((Activity) context).finish();

        }

        /**
         * 登陆之后的信息 cjh 2016年1月12日
         *
         * @return
         */
        public String LoginInfo() {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("storeId", PreferenceUtils.getStoreId());
            map.put("userId", PreferenceUtils.getUserId());
            map.put("phone", PreferenceUtils.getPhone());
            return GsonUtils.get().objectToJson(map);
        }

        /**
         * 显示网页toast弹窗 cjh 2016年2月2日
         *
         * @param message
         */
        public void showMessage(final String message) {
            ((Activity) context).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, message, Toast.LENGTH_LONG).show();
            }
            });

        }

        }

        /**
         * @auther xt 2016年5月11日 得到根Fragment
         *
         * @return
         */
        private Fragment getRootFragment() {
        Fragment fragment = getParentFragment();
        while (fragment.getParentFragment() != null) {
            fragment = fragment.getParentFragment();
        }
        return fragment;

        }

        /**
         *
         * @copy xt Compress image by pixel, this will modify image width/height.
         *       Used to get thumbnail
         *
         * @param imgPath
         *            image path
         * @param pixelW
         *            target pixel of width
         * @param pixelH
         *            target pixel of height
         * @return
         */
        public Bitmap ratio(String imgPath, float pixelW, float pixelH) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        // 开始读入图片,此时把options.inJustDecodeBounds 设回true,即只读边不读内容
        newOpts.inJustDecodeBounds = true;
        newOpts.inPreferredConfig = Config.RGB_565;
        // Get bitmap info, but notice that bitmap is null now
        Bitmap bitmap = BitmapFactory.decodeFile(imgPath, newOpts);

        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        // 想要缩放的目标尺寸
        float hh = pixelH;// 设置高度为240f时,可以明显看到图片缩小了
        float ww = pixelW;// 设置宽度为120f,可以明显看到图片缩小了
        // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
        int be = 1;// be=1表示不缩放
        if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0)
            be = 1;
        newOpts.inSampleSize = 1;// 设置缩放比例
        // 开始压缩图片,注意此时已经把options.inJustDecodeBounds 设回false了
        bitmap = BitmapFactory.decodeFile(imgPath, newOpts);
        // 压缩好比例大小后再进行质量压缩
        // return compress(bitmap, maxSize); // 这里再进行质量压缩的意义不大,反而耗资源,删除
        return bitmap;
        }

        /**
         * @auther xt 2016年5月11日 bitmap转为base64
         *
         * @param bitmap
         * @return
         */
        public static String bitmapToBase64(Bitmap bitmap) {

        String result = null;
        ByteArrayOutputStream baos = null;
        try {
            if (bitmap != null) {
            baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

            baos.flush();
            baos.close();

            byte[] bitmapBytes = baos.toByteArray();
            result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
            if (baos != null) {
                baos.flush();
                baos.close();
            }
            } catch (IOException e) {
            e.printStackTrace();
            }
        }
        return result;
        }

    }

    展开全文
  • 前面写完了Qt for Android 调用系统摄像头和相册后,发现并不满足一些人的特殊需求,比如需要调用摄像头来录像,虽然不知道这个功能能用到什么地方,但是有人提出了,我还是实现一下。如果没有看过我前面Qt for ...

            前面写完了Qt for Android 调用系统摄像头和相册后,发现并不满足一些人的特殊需求,比如需要调用摄像头来录像,虽然不知道这个功能能用到什么地方,但是有人提出了,我还是实现一下。如果没有看过我前面Qt for Android 调用系统摄像头和相册这篇博客的请先转移看一下,毕竟是在这篇博客的基础上加的一个新功能,所以,我就只列出如何实现录像部分的核心代码了:

    在前面的代码工程中插入下面的代码块:(因为代码不好贴,所以只显示图片,为了排版美观)


    然后在StartActivityForResult回调中处理录像好的数据路径,如下图:


    这个videoPath就是所播放的路径了,只要把这个路径再传送给QT那边接收,即可播放视频,下面展示一下播放的处理:


            因为是在qml播放的,获取路径播放时发现视频是倒置的,自动倒置的,具体原因也不清楚,后来自己的处理了一下,将orientation这个属性直接旋转180度,当然如果视频是正常的,那这样设置就会导致正常视频倒置了。希望知道此原因的朋友,可以告知一下。

            完整Demo:https://download.csdn.net/download/clinuxf/10295906

    展开全文
  • 很多时候我们需要调用系统摄像头进行拍照,然后得到拍照之后的图片,然后对图片进行一些处理。比如微信设置头像,就可以选择调用设备存在摄像头APP进行拍照,然后对图像进行裁剪,最终设置为头像,把头像传给服务器...

    很多时候我们需要调用系统摄像头进行拍照或者从图库选择照片,然后对得到的图片进行一些处理。比如微信设置头像,就可以选择调用设备存在摄像头APP进行拍照,然后对图像进行裁剪,最终设置为头像。


    下面来进行讲解。


    主要分为以下几个部分:

    1、获得摄像头Feature和写文件的权限

    由于不需要直接操作摄像头,而只是调用存在的APP,所以不需要Camera权限,自需要获得Camera Feature即可:

    <uses-feature
            android:name="android.hardware.camera2"
            android:required="true" />

    如果需要把得到的图片写入外部存储,需要声明写外部存储权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    如果需要把得到的图片写入私有存储,在Android4.3及以下,需要声明WRITE_EXTERNAL_STORAGE权限,从Android4.4开始,这个权限不再需要了,所以可以声明权限如下所示:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

    2、创建一个文件用来保存得到的图片

    /**
         * 创建保存得到的图片的文件
         *
         * @return
         * @throws IOException
         */
        private File createImageFile() throws IOException {
            if (checkSDCardAvaliable()) {
                File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES), "CameraDemo");
                if (!mediaStorageDir.exists()) {
                    if (!mediaStorageDir.mkdirs()) {
                        Log.d(TAG, "failed to create directory");
                        return null;
                    }
                }
                // Create an image file name
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                String imageFileName = "JPEG_" + timeStamp;
                String suffix = ".jpg";
                File image = new File(mediaStorageDir + File.separator + imageFileName + suffix);
                mCurrentPhotoPath = image.getAbsolutePath();
                return image;
            }
            return null;
        }


    3、启动Intent进行拍照、启动Intent从图库选择照片

      /**
         * 启动拍照
         */
        private void startCamera() {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // Ensure that there's a camera activity to handle the intent
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                // Continue only if the File was successfully created
                if (mSavePhotoFile != null) {
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                            Uri.fromFile(mSavePhotoFile));//设置文件保存的URI
                    startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
                }
            }
        }

     /**
         * 从图库选择照片
         */
        private void selectPhoto() {
            Intent intent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(intent, REQUEST_SELECT_PHOTO);
        }


    4、在onActivityResult回调函数里面,对图片进行处理,包括对图片进行裁剪以及显示到ImageView以及把图片加入到Media Provider's database

     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
                switch (requestCode) {
                    case REQUEST_TAKE_PHOTO:  //拍照
                        //注意,如果拍照的时候设置了MediaStore.EXTRA_OUTPUT,data.getData=null
                        startPhotoZoom(Uri.fromFile(mSavePhotoFile), 256, 256);
                        break;
                    case REQUEST_SELECT_PHOTO://选择图片
                        startPhotoZoom(data.getData(), 256, 256);
                        break;
                    case REQUEST_CROP_PHOTO:
                        Bundle extras = data.getExtras();
                        if (extras != null) {
                            Bitmap photo = extras.getParcelable("data");
                            //把图片显示到ImgeView
                            iv_diaplay.setImageBitmap(photo);
                            //把图片加入图库
                            galleryAddPic();
                        }
                        break;
                }
            }
        }


    裁剪照片:

     /**
         * 裁剪照片
         */
        public void startPhotoZoom(Uri uri, int width, int height) {
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setDataAndType(uri, "image/*");
            // 设置裁剪
            intent.putExtra("crop", "true");
            intent.putExtra("scale", true);// 去黑边
            // aspectX aspectY 是宽高的比例
            intent.putExtra("aspectX", width/height);
            intent.putExtra("aspectY", 1);
            // outputX outputY 是裁剪图片宽高
            intent.putExtra("outputX", width);
            intent.putExtra("outputY", height);
            // 图片格式
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            intent.putExtra("noFaceDetection", true);// 取消人脸识别
            intent.putExtra("return-data", true);// true:返回uri,false:不返回uri
            // 同一个地址下 裁剪的图片覆盖之前得到的图片
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mSavePhotoFile));
            startActivityForResult(intent, REQUEST_CROP_PHOTO);
        }
    

    把图片加入Media Provider's database

     /**
         * 触发系统的media scanner来把图片加入Media Provider's database
         */
        private void galleryAddPic() {
            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            File f = new File(mCurrentPhotoPath);//
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);  //设置URI
            this.sendBroadcast(mediaScanIntent);  //发送广播
        }
    把Bitmap保存到外部存储
    /**
         * 把图片保存到SD卡
         * @param bitmap
         * @param targetPath
         */
        public static void SavePhotoToSdCard(Bitmap bitmap, String targetPath) {
    
            FileOutputStream fileOutputStream = null;
            File file = new File(targetPath);
            try {
                fileOutputStream = new FileOutputStream(file);
                if (bitmap != null) {
                    if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100,
                            fileOutputStream)) {
                        fileOutputStream.flush();
                    }
                }
            } catch (FileNotFoundException e) {
                file.delete();
                e.printStackTrace();
            } catch (IOException e) {
                file.delete();
                e.printStackTrace();
            } finally {
                try {
                    // 到最后一定要关闭
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    然后,你就可以在你设备的外部存储根目录下的/Pictures/CameraDemo/目录下面找到你的图片,同时在设备的图库里面发现一个新建项"CameraDemo",里面有拍照或者从图库选择得到的图片。



    展开全文
  • delphi10.2 android开发调用 并控制摄像头的例子,欢迎大家借鉴
  • 直接上代码,代码里面有注释: ... uses-permission android:name="android.permission.INTERNET"/> 调用摄像头的权限 --> uses-permission android:name="android.permission.CAMERA"/> 文件系统权限
  • 手机和pc间摄像头调用,有源码,供大家学习和参考,可以直接运行,包含pc端和手机端
  • 但实际上用html5调用手机摄像头存在很多问题: 1)谷歌的发布的Chrome到了21版本后,才新增了一个用于高质量视频音频通讯的getUserMedia API,该API允许Web应用程序访问摄像头和麦克风,其他手机浏览器只有opera支持...
  • android和opencv合拼一个项目,编译后的项目无需下载opencv。
  • 本文将讨论用Qt访问Android摄像头(或者说默认摄像头接口)所需要的步骤。很遗憾,自4.5版本以后OpenCV不再提供访问原生(Native C++)摄像头的库稳定方法,如果你想用Qt开发Android OpenCV程序的话,本文显然就是你...
  • 直接下载可以运行, android studio 工具开发, webview引用的本地页面 或者远程页面调用android 摄像头, 通过zxing解析包 进行二维码解析
  • 安卓调用摄像头如何调用摄像头拍照创建布局文件主函数方法 如何调用摄像头拍照 创建布局文件 以为每次找CSDN 总是找不到全部的代码,所以我就直接全部粘贴下来了 // 创建布局文件 <?xml version="1.0" encoding=...
  • Android调用摄像头拍照

    2019-03-04 17:06:29
    应用程序可以调用摄像头进行拍照并将图片保存在SD卡上,具体步骤如下: 1.创建File对象 File对象用于存储拍照后的照片,具体代码如下: File outputImage = new File(getExternalCacheDir(),"output_image....
  • Html5页面Js调用android本地相机和图片
  • 我想控制录制视频的大小 是不是应该控制分辨率 30S 不能超出2M 什么方法能达到 多谢!
  • 很多应用程序都可能会使用到调用摄像头拍照的功能,比如说程序里需要上传一张图片作为用户的头像,这时打开摄像头拍张照是最简单快捷的。下面就让我们通过一个例子来学习一下,如何才能在应用程序里调用手机的摄像头...
  • 适合开发需要开发外接摄像头的,可以实现拍照、录像以及上下转动摄像头
  • Android Zxing包 调用手机摄像头去进行条码扫描。目前我只试了一维码和二维码。
  • 今天学习一下安卓,想调一下摄像头,拍张照片,转为Base64编码,再输入一些文本,然后发送给后台,类似:...Android开发之调用摄像头 报错: java.lang.NullPointerException: Attempt to invoke virtual method ‘an
1 2 3 4 5 ... 20
收藏数 20,749
精华内容 8,299
关键字:

调用android摄像头