尺寸压缩(在网络下载中进行压缩和SD卡获取时压缩)+质量压缩+资源提供者

尺寸压缩在网络下载中进行压缩

优点:防止OOM溢出
思路:在获取道输入流后找一个东西把它装下,实现数据缓存

实现代码:

static class MyTask extends AsyncTask<String,Object,Bitmap>{

    @Override
    protected Bitmap doInBackground(String... strings) {
        try {
            URL url = new URL(strings[0]);
            HttpURLConnection hcon = (HttpURLConnection) url.openConnection();
            if (hcon.getResponseCode() == 200){
                InputStream is = hcon.getInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int lne = -1;
                byte[] bytes = new byte[1024];
                while ((lne = is.read(bytes))!= -1){
                    baos.write(bytes,0,lne);
                }
                byte[] data = baos.toByteArray();
                //二次采样
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeByteArray(data,0,data.length,options);
                int outHeight = options.outHeight;
                int outWidth = options.outWidth;
                int size = 1;
                while (outHeight/size>100||outWidth/size>200){
                    size*=2;
                }
                options.inJustDecodeBounds = false;
                options.inSampleSize = size;
               Bitmap bitmap =  BitmapFactory.decodeByteArray(data,0,data.length,options);
                return bitmap;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

尺寸压缩SD卡获取时压缩

优点:防止OOM溢出

实现代码:

//第一次采样
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(list.get(position),options);
//获取宽高
int outWidth = options.outWidth;
int outHeight = options.outHeight;
int size = 1;
while (outWidth/size>300||outHeight/size>300){
    size*=2;
}
//二次采样
options.inJustDecodeBounds = false;
options.inSampleSize = size;
Bitmap bitmap = BitmapFactory.decodeFile(list.get(position), options);
holder.img.setImageBitmap(bitmap);

质量压缩

优点:减少SD资源使用,节省空间
关键方法:compress()

实现代码:

//判断SD卡是否挂载
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    //参数一 图片的格式 JPG PNG  参数二 质量 0-100 参数三 输出流
    try {
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(filepath));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

资源提供者ContentProvider

ContentProvider介绍:
ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。
技能get点:
访问系统自带的内容提供者(******)
手机联系人/音频/视频/图库/短信/系统设置
自己写内容提供者
需要加权限

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

内容提供者获得图库

实现代码:

//获取解析方
ContentResolver contentResolver = getContentResolver();
//获取URI
Uri image = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;//图片URI
Cursor query = contentResolver.query(image, null, null, null, null);
//拿到数据图片
while (query.moveToNext()){
    String data = query.getString(query.getColumnIndex(MediaStore.Images.Media.DATA));
    String title = query.getString(query.getColumnIndex(MediaStore.Images.Media.TITLE));
    int width = query.getInt(query.getColumnIndex(MediaStore.Images.Media.WIDTH));
    int height = query.getInt(query.getColumnIndex(MediaStore.Images.Media.HEIGHT));
    Log.d("图片", "图片: "+title+":"+data+":"+height+":"+width);
}

内容提供者获得音乐

实现代码:

//获取解析方
ContentResolver contentResolver = getContentResolver();
//获取URI
Uri music = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//音乐URI
Cursor query2 = contentResolver.query(music, null, null, null, null);
//拿到数据音乐
while (query2.moveToNext()){
    String data = query2.getString(query2.getColumnIndex(MediaStore.Audio.Media.DATA));
    String artist = query2.getString(query2.getColumnIndex(MediaStore.Audio.Media.ARTIST));
    String title = query2.getString(query2.getColumnIndex(MediaStore.Audio.Media.TITLE));
    String duration = query2.getString(query2.getColumnIndex(MediaStore.Audio.Media.DURATION));
    Log.e("音乐", "音乐: "+title+":"+data+":"+artist+":"+duration);
}

内容提供者获得视频

实现代码:

//获取解析方
ContentResolver contentResolver = getContentResolver();
//获取URI
Uri vido = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;//视频URI
Cursor query3 = contentResolver.query(vido, null, null, null, null);
//拿到数据视频
while (query3.moveToNext()){
    String data = query3.getString(query3.getColumnIndex(MediaStore.Video.Media.DATA));
    String artist = query3.getString(query3.getColumnIndex(MediaStore.Video.Media.ARTIST));
    String title = query3.getString(query3.getColumnIndex(MediaStore.Video.Media.TITLE));
    String duration = query3.getString(query3.getColumnIndex(MediaStore.Video.Media.DURATION));
    Log.e("视频", "视频: "+title+":"+data+":"+artist+":"+duration);
}

1.获取音频:   (1)uri:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI   (2)字段:TITLE:歌名   ARTIST 歌手   DURATION 总时长  DATA 地址
String[] strs= new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA};
2.获取视频:   (1)uri:MediaStore.Video.Media.EXTERNAL_CONTENT_URI   (2)字段:TITLE:歌名   ARTIST 歌手   DURATION 总时长  DATA 地址
String[] strs= new String[]{MediaStore.Video.Media.TITLE,MediaStore.Video.Media.ARTIST,MediaStore.Video.Media.DURATION,MediaStore.Video.Media.DATA};
3.获取图库:   (1)uri:MediaStore.Images.Media.EXTERNAL_CONTENT_URI   (2)字段:
MediaStore.Images.Media.TITLE;图片名称
MediaStore.Images.Media.SIZE;大小
MediaStore.Images.Media.DATA;地址
4.获取联系人:   (1)uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI   (2)字段:Phone.DISPLAY_NAME:姓名   NUMBER:电话    String[] strs= new
String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};
5.获取短信:   (1)uriTelephony.Sms.CONTENT_URI   (2)字段:ADDRESS 地址   BODY 内容    String[] strs= new
String[]{Telephony.Sms.ADDRESS,Telephony.Sms.BODY};
备注:1 2 3 读sd卡的权限    4 读联系人的权限   5 读短信的权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MX_XXS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值