Android调用相机拍照,调用图库,上传图片

这篇具有很好参考价值的文章主要介绍了Android调用相机拍照,调用图库,上传图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android调用相机进行拍照,调用图库获取图片,可进行裁剪,显示图片,并将图片上传文章来源地址https://www.toymoban.com/news/detail-513822.html

public static final int PHOTO_REQUEST_CAREMA = 1;//拍照
public static final int CROP_PHOTO = 2;//裁剪
public static final int PHOTO_ALBUM = 3;//相册
 private Intent intentPhoto;
private Uri image_uri;
private Uri album_uri;
private MeMoryBitmap meMoryBitmap;
private static File tempFile,album_tempFile;
private static final String TAG="RegisterActivity"; 
//拍照
    private void openCamera() {
        Bitmap bitmap=null;
        ivPhotoshow.setImageBitmap(bitmap);
        //调用方法,解决内存泄露
        meMoryBitmap.recycleImageView(ivPhotoshow);
        //获取操作系统的版本号
        int currentapiVersion= Build.VERSION.SDK_INT;
        //MediaStore.ACTION_IMAGE_CAPTURE调用系统相机拍照
        intentPhoto=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if(hasSdcard()){
            //获取时间戳
            SimpleDateFormat timeStampFormat=new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
            String filename=timeStampFormat.format(new Date());
            //获取外部存储根目录Environment.getExternalStorageDirectory()方法已经过时,改用context.getExternalFilesDir(null).getAbsolutePath()
            tempFile=new File(Environment.getExternalStorageDirectory(),
                    filename+".jpg");
            if(currentapiVersion<24){
                image_uri=Uri.fromFile(tempFile);
                //MediaStore.EXTRA_OUTPUT规避Intent携带信息的不靠谱
                intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT,image_uri);
            }else{
                //兼容android7.0 使用共享文件的形式.ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,
                // contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。
                ContentValues contentValues=new ContentValues(1);
                //获取文件
                contentValues.put(MediaStore.Images.Media.DATA,tempFile.getAbsolutePath());
                //判断应用是否授予权限
                if(ContextCompat.checkSelfPermission(RegisterActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED){
                    String[] PERMISSIONS={"android.permission.CAMERA","android.permission.WRITE_EXTERNAL_STORAGE"};
                    //权限申请结果
                    ActivityCompat.requestPermissions(RegisterActivity.this,PERMISSIONS,1);
                    return;
                }
                //getContext().getContentResolver().insert(...);
                /**
                 * getContext()是获得一个上下文对象(Context),一般在四大组件中都会获取上下文对象
                 * 在Activity和Service中,就没必要获取Context了,因为他本身就是,所以可以直接调用getContentResolver()。
                 * getContext().getContentResolver()返回的是ContentResolver 对象,ContentResolver负责获取ContentProvider提供的数据。
                 * 将图片保存至相册
                 */
                image_uri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
                intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT,image_uri);
            }
        }
        /**
         * 在Activity中得到新打开Activity 关闭后返回的数据,
         * 需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,
         * 新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,
         * 必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法
         */

        startActivityForResult(intentPhoto,PHOTO_REQUEST_CAREMA,null);
    }
 //调用图库
    private void openAlbum() {
        Bitmap bitmap=null;
        ivPhotoshow.setImageBitmap(bitmap);
        //获取时间戳
        SimpleDateFormat timeStampFormat=new SimpleDateFormat(
                "yyyy_MM_dd_HH_mm_ss"
        );
        String filename=timeStampFormat.format(new Date());
        //图片命名
        album_tempFile=new File(Environment.getExternalStorageDirectory(),filename+".jpg");
        if(album_tempFile.exists()){
            album_tempFile.delete();
        }else {
            /**
             * 创建目录的方式大致有这两种情况,这两种情况的区别是
             * 1. mkdir():根据相对路径创建目录,只会在原有的目录里面创建,如果上面一级的目录xxdir不存在,则这次创建便会失败, 报xxxdir这个目录找不到的异常
             * 2. mkdirs():根据绝对路径新建目录,如果上一级目录不存在,则会将上一级目录创建完后,再创建后面一级的目录
             */
            album_tempFile.mkdirs();
        }
        try {
            album_tempFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Uri.parse("file://" + new File(path).toString())==Uri.fromFile(new File(path))
        album_uri=Uri.fromFile(album_tempFile);
        Intent intent_album=null;
        //判断操作系统版本
        if(Build.VERSION.SDK_INT<19){
            //ACTION_GET_CONTENT:允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)调用图库,获取所有本地图片
            intent_album=new Intent(Intent.ACTION_GET_CONTENT);
            /**
             * 正常的访问系统自带的文件管理器。但是setType只支持单个setType一般是以下这种 intent_album.setType("image/*");
             * 我要限制只查看ppt ,doc,docx,pptx,pdf等文件
             * public static final String DOC = "application/msword";
             *     public static final String DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
             *     public static final String XLS = "application/vnd.ms-excel application/x-excel";
             *     public static final String XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
             *     public static final String PPT = "application/vnd.ms-powerpoint";
             *     public static final String PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
             *     public static final String PDF = "application/pdf";
             *
             * try {
             *                     Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
             *                     intent.addCategory(Intent.CATEGORY_OPENABLE);
             *                     //设置doc,docx,ppt,pptx,pdf 5种类型
             *                     intent.setType("application/msword|application/vnd.openxmlformats-officedocument.wordprocessingml.document" +
             *                             "|application/vnd.ms-powerpoint|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/pdf");
             *                     //在API>=19之后设置多个类型采用以下方式,setType不再支持多个类型
             *                     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
             *                         intent.putExtra(Intent.EXTRA_MIME_TYPES,
             *                                 new String[]{DOC,DOCX, PPT, PPTX,PDF});
             *                     }
             *                     startActivityForResult(intent, 1001);
             *                 } catch (ActivityNotFoundException e) {
             *                 }
             */
            intent_album.setType("image/*");
        }else{
            /**
             * 一、调用图库,获取所有本地图片:
             * Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
             *  imageIntent.setType("image/*");
             *  startActivityForResult(imageIntent, PICK_CODE); //PICK_CODE是常量
             *  二、调用本地联系人:
             *  Intent intent = new Intent(Intent.ACTION_PICK);
             *  intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
             *  startActivityForResult(intent, PICK_CONTACT);
             *  三、调用音乐,获取所有本地音乐文件:
             * Intent audioIntent = new Intent(Intent.ACTION_GET_CONTENT);
             * audioIntent.setType("audio/*");
             * startActivityForResult(audioIntent, PICK_AUDIO);
             * 四、调用视频,获取所有本地视频文件:
             * Intent videoIntent = new Intent(Intent.ACTION_GET_CONTENT);
             * videoIntent.setType("video/*");
             * startActivityForResult(videoIntent, PICK_VIDEO);
             */
            intent_album=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        }
        //允许裁剪
        intent_album.putExtra("crop",true);
        //允许缩放
        intent_album.putExtra("scale",true);
        //图片的输出位置
        intent_album.putExtra(MediaStore.EXTRA_OUTPUT,album_uri);

        startActivityForResult(intent_album,PHOTO_ALBUM);
    }
    //判断sdcard是否被挂载,判断SD卡状态
    public static boolean hasSdcard(){
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case PHOTO_REQUEST_CAREMA:
                if(resultCode==RESULT_OK){
                    /**
                     * 调用安卓系统进行图片裁剪问题
                     */
                    Intent intent=new Intent("com.android.camera.action.CROP");
                    //设置intent的data和Type属性。
                    intent.setDataAndType(image_uri,"image/*");
                    intent.putExtra("scale",true);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,image_uri);
                    setPicture(ivPhotoshow,image_uri);
                }
                break;
            case PHOTO_ALBUM:
                if(resultCode==RESULT_OK){
                    album_uri=data.getData();
                    Intent intent=new Intent("com.android.camera.action.CROP");
                    intent.setDataAndType(album_uri,"image/*");
                    intent.putExtra("scale",true);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,album_uri);
                    setPicture(ivPhotoshow,album_uri);
                    // 启动裁剪
                  //  startActivityForResult(intent, SHOW_PHOTO_ALBUM);
                }
                break;
            //图片裁剪
            case CROP_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(this.getContentResolver()
                                .openInputStream(image_uri));
                        ivPhotoshow.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }

    private void setPicture(ImageView imageView,Uri uri) {
        Bitmap bitmap1=null;
        ivPhotoshow.setImageBitmap(bitmap1);
        meMoryBitmap.recycleImageView(ivPhotoshow);
        if(context!=null){
            //获取图片大小
            int targetW=imageView.getWidth();
            int targetH=imageView.getHeight();
            //Options,此类用于解码Bitmap时的各种参数控制,
            BitmapFactory.Options bmpOptions=new BitmapFactory.Options();
            //如果将inJustDecodeBounds这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸。
            // 这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时。这是一个非常有用的属性。
            //充分利用它,来避免大图片的溢出问题。
            bmpOptions.inJustDecodeBounds=true;
            try {
                //BitmapFactory.decodeStream解决OOM内存用完了的情况
                BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));
                int photoW=bmpOptions.outWidth;
                int photoH=bmpOptions.outHeight;
                int scaleFactor=Math.min(photoW/targetW,photoH/targetH);
                bmpOptions.inJustDecodeBounds=false;
                //Options中有个属性inSampleSize。我们可以充分利用它,实现缩放
                bmpOptions.inSampleSize=scaleFactor;
                int sizeFactor=calculateInSampleSize(bmpOptions,targetW,targetH);
                Log.d(TAG,"sizeFactor"+sizeFactor+",scaleFactor"+scaleFactor);
                /*节约内存 下面两个字段需要组合使用 */
                bmpOptions.inPurgeable=true;
                bmpOptions.inInputShareable = true;
                //再次decode获取bitmap
                Bitmap bitmap=BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri),null,bmpOptions);
                imageView.setImageBitmap(bitmap);
                registerBean.setAvatar(String.valueOf(uri));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    private int calculateInSampleSize(BitmapFactory.Options bmpOptions, int reqWidth, int reqHeight) {
        final int height=bmpOptions.outHeight;
        final  int width=bmpOptions.outWidth;
        int inSampleSize=1;
        if(height>reqHeight||width>reqWidth){
            final  int halfheight=height/2;
            final  int halWidth=width/2;
            while((halfheight/inSampleSize)>reqHeight&&(halWidth/inSampleSize)>reqWidth){
                inSampleSize*=2;
            }
        }
        return inSampleSize;
    }
  //图片上传,调用接口
    private void uploadOk(File file) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .build();
        //设置上传文件以及文件对应的MediaType类型
        RequestBody requestBody = MultipartBody.create(MediaType.parse("image/jpeg"), file);
        //MultipartBody文件上传
        /**区别:
         * addFormDataPart:   上传key:value形式
         * addPart:  只包含value数据
         */
        RequestBody body = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)//设置文件上传类型
                .addFormDataPart("key", "img")//文件在服务器中保存的文件夹路径
                .addFormDataPart("file", file.getName(), requestBody)//包含文件名字和内容
                .build();
        Request request = new Request.Builder()
                .url(你的图片上传url)
                .header("Token",你的token)
                .post(body)
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("e","e"+e.getMessage());
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String str = response.body().string();
                //返回的数据,可用Gson解析
                
            }
        });
    }

MeMoryBitmap

public class MeMoryBitmap {
    public static MeMoryBitmap mInstance=null;

    public MeMoryBitmap() {
    }

    public static MeMoryBitmap getmInstance() {
        if(mInstance==null){
            mInstance=new MeMoryBitmap();
        }
        return mInstance;
    }
    /**
     * 网络获取俩,解析url获取图片
     * @param path
     * @return
     * @throws IOException
     */
    public static Bitmap getBitmap(String path) throws IOException {
        try {
            Log.d("url","bitmapurl000:"+path);
            URL url = new URL(path);
            //网络请求接口HttpURLConnection,可以实现简单的基于URL请求、响应功能。得到connection对象。
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            //设置请求方式
            conn.setRequestMethod("GET");
            判断得到响应码
            if (conn.getResponseCode() == 200) {
                得到响应流
                InputStream inputStream = conn.getInputStream();
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                inputStream.close();
                return bitmap;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解决内存泄漏问题
     * @param
     */
    public void recycleImageView(ImageView ivPhotoshow) {
        if(ivPhotoshow==null){return;}
        if(ivPhotoshow instanceof ImageView){
            Drawable drawable=ivPhotoshow.getDrawable();
            //instanceof 是 Java 的保留关键字,它的作用是测试它左边的对象是否是它右边的类的实例
            if(drawable instanceof BitmapDrawable){
                Bitmap bmp=((BitmapDrawable) drawable).getBitmap();
                if(bmp!=null&&!bmp.isRecycled()){
                    ivPhotoshow.setImageBitmap(null);
                    bmp.recycle();

                }
            }
        }
    }

    /**
     * 动态获取图片的缩放值
     *
     * @param options
     *            BitmapFactory.Options
     * @param reqWidth
     *            设定的Img控件宽度
     * @param reqHeight
     *            设定的Img控件高度
     * @return inSampleSize
     */
    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight)
    {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth)
        {
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
            while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth)
            {
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }
}

到了这里,关于Android调用相机拍照,调用图库,上传图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp,小程序上传图片,调用相机,打开相册功能

    uniapp上传头像上传图片,上传评价等功能都可以使用这个方法 将接口替换和参数替换其他共用直接使用即可,需要弹窗就使用俩个参数,直接打开相册或者相机就只填一个参数

    2024年02月14日
    浏览(32)
  • Android webview上传图片(调起相册/相机上传)

    概述 默认情况 WebView 不支持input type=file,WebView 点击没有反应。 兼容 重写 webview 的 webchromeClient 中的 openFileChooser 方法。Android 版本的多样性,就理所当然的各种兼容。 具体代码实现 网上也有很多实现方式,这边记录一下自己用到的一种 webview 调用时,弹出本地弹框,选择(

    2023年04月21日
    浏览(30)
  • uni-app 调用相机或相册图片并转为base64格式上传图片

    1、调用相机或相册上传图片 2、图片文件转base64 (1)下载插件 (2)页面引入插件 3、image-tools/index.js源码

    2024年02月11日
    浏览(37)
  • uniapp如何调用手机相机进行拍照

    uniapp调用手机拍照的方法,我所用到的两种方法列举在下方 方法一:使用uni.chooseImage 方式二:使用plus.camera.getCamera

    2024年02月11日
    浏览(39)
  • android studio开发——android11版本以上权限动态申请问题,包括文件读写、图片、相机的调用

    用于android手机的升级,现在已经是android13版本了,对于权限问题可能更加敏感了,前段时间开发发现之前的方法已经不再适用于android11以后的版本了 读写权限申请最好是跳转到设置中进行才是最好了,下面我们开始进行 首先是AndroidManifest.xml文件的权限 然后这里讲解一下权

    2024年02月10日
    浏览(47)
  • uniapp小程序开发自定义相机、拍照、上传

    功能背景 项目开发小程序,想要实现一个自定义相机的功能,需要可以拍照,并且显示经纬度等一些其他信息在相机画面上。而且拍照上传,是可以将文字叠加在图片上(目前我这里是由后端实现的,前端应该也是可以做的,利用canvas,这个后面再研究)。这里仅仅是介绍小

    2024年02月16日
    浏览(30)
  • OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

    此Demo展示如何在ArkTS中调用相机拍照和录像,以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力@ohos.abilityAccessCtrl 相机模块能力接口@ohos.multimedia.camera 图片处理接口@ohos.multimedia.image 音视频相关媒体业务能力接口@ohos.multimedia.media 媒体

    2024年04月28日
    浏览(31)
  • 鸿蒙实战开发-相机和媒体库、如何在eTS中调用相机拍照和录像

    此Demo展示如何在eTS中调用相机拍照和录像,以及使用媒体库接口将图片和视频保存的操作。实现效果如下: 使用说明 1.启动应用,在权限弹窗中授权后返回应用,进入相机界面。 2.相机界面默认是拍照模式,点击底部拍照按钮可以拍照,拍照完成会在底部左侧显示照片预览

    2024年04月09日
    浏览(46)
  • Android保存图片到系统图库并通知系统相册刷新

      在android开发中保存应用的图片并插入到系统图库同时通知相册刷新的功能,做完后发现在部分手机上出现虽然图片保存成功了,但是相册却找不到图片的问题,查找文件夹图片也已经存在,可就是在相册里刷新不出来。   以上代码便是将Bitmap保存图片到指定的路径/

    2024年01月24日
    浏览(35)
  • android图库隐藏不愿显示的图片及目录

    前言:当你的相册图片过多,打开加载很慢的情况下,通常我们会想部分不显示,隐藏掉,那么你就可以按照以下的方法解决 用你的手机文件浏览器或者文件管理器打开根目录,新建一个名为** .nomedia **文件,复制这个文件,当你想隐藏什么文件夹就把这个文件粘贴到这个文件

    2023年04月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包