尺寸压缩在网络下载中进行压缩
优点:防止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 读短信的权限