OKHTTP图片上传工具类(值得注意的是:安卓6.0以及部分华为手机需要权限申请,不然上传图片会不成功):
public static Call uploadBitmap(String url, String deviceId, Bitmap bitmap) { //[byte[]] ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); RequestBody requestBody1 = RequestBody.create(MediaType.parse("image/png"), baos.toByteArray()); //第二个参数只需要关注后缀即可,服务器每次返回的文件名不一样。 //ok2 RequestBody requestBody2 = new MultipartBuilder() .type(MultipartBuilder.FORM) .addFormDataPart("deviceId", deviceId) .addFormDataPart("file", "re.png", requestBody1) .build(); Request request = new Request.Builder() .url(url) .post(requestBody2) // .build(); return client.newCall(request); }权限申请:
//第二个参数是需要申请的权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //权限还没有授予,需要在这里写申请权限的代码 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_CALL_PHONE2); } else { //权限已经被授予,在这里直接写要执行的相应方法即可 PhotoUtilChange.getPhoto(DetailActivity.this, null); }
获取剪切板最新内容
/**获取剪切板信息以及监听*/ mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); if (mClipboardManager.hasPrimaryClip()) { ClipData cd = mClipboardManager.getPrimaryClip(); ClipData.Item item = null; for (int i = 0; i < cd.getItemCount(); i++) { item = cd.getItemAt(i); } if (item.getText().toString() != null && isURL(item.getText().toString())) { dialog.input.setText(item.getText().toString()); } } mClipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() { @Override public void onPrimaryClipChanged() { //TODO } });
判断一个字符是不是URL
//判断一个字符串是不是url public static boolean isURL(String str) { //转换为小写 str = str.toLowerCase(); String domainRules = "com.cn|net.cn|org.cn|gov.cn|com.hk|公司|中国|网络|com|net|org|int|edu|gov|mil|arpa|Asia|biz|info|name|pro|coop|aero|museum|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cf|cg|ch|ci|ck|cl|cm|cn|co|cq|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|es|et|ev|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gp|gr|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|ml|mm|mn|mo|mp|mq|mr|ms|mt|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|va|vc|ve|vg|vn|vu|wf|ws|ye|yu|za|zm|zr|zw"; String regex = "^((https|http|ftp|rtsp|mms)?://)" + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@ + "(([0-9]{1,3}\\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 + "|" // 允许IP和DOMAIN(域名) + "(([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]+\\.)?" // 域名- www. + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." // 二级域名 + "(" + domainRules + "))" // first level domain- .com or .museum + "(:[0-9]{1,4})?" // 端口- :80 + "((/?)|" // a slash isn't required if there is no file name + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; Pattern pattern = Pattern.compile(regex); Matcher isUrl = pattern.matcher(str); return isUrl.matches(); }
给ListView添加头部布局
/**添加网络异常的头部布局*/ // LayoutInflater inflater = LayoutInflater.from(getContext()); // View error = inflater.inflate(R.layout.network_error, null); // mListView.addHeaderView(error);listview的
mListView.setTextFilterEnabled(true);//设置lv可以被过虑
最新安卓studio自带的图片加载Picasso(
优点:自动将图像缓存在本地
- 通过图片压缩转换以减少内存消耗
- 自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载
Picasso.with(mContext).load(url.trim()).into(vh.ivPicture);
图像格式转换:很多时候需要将图片进行格式转换或者剪裁以节省内存或者达到我们的布局效果:
剪裁大小:
Picasso.with(mContext).load(url.trim()).resize(50,50).centerCrop().into(vh.ivPicture);占位符图片: 所谓的占位符图像即当图片未正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误时显示的默认图片,通过error()设置:
Picasso.with(mContext).load(url.trim()).placeholder(R.drawable.imagle).error(R.drawable.error);载入本地资源: 除了通过网络下载图片,Picasso也可以载入本地图片资源:
调试: 为了方便调试,你可以通过调用Picasso的 setIndicatiorEnabled(true) ;可以让不同来源的图片显示一个不同的色彩标记;Picasso.with(mContext).load(url.trim()).into(vh.ivPicture);Picasso.with(Context).load("file:///image.jpg").into(imageview);
Picasso.with(Context).load(new File("")).into(imageview);
Picasso.with(context) .load(imageUrl) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.NO_CACHE) .resize(512, 512) .error(R.drawable.luosi) .noFade() .into(vh.ivDevice);
无缓存加载图片,每次都要重新加载
官方下拉刷新控件:SwipyRefreshLayout
{ Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case Contants.REFRESH_COMPLETE: mAdapter.notifyDataSetChanged(); init(); mSwipeLayout.setRefreshing(false); break; } } ; }; }
//设置刷新时动画的颜色,可以设置4个 refreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
mSwipyRefreshLayout.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() { @Override public void onRefresh(int index) { //刷新操作
mHandler.sendEmptyMessageDelayed(Contants.REFRESH_COMPLETE, 2000)} @Override public void onLoad(int index) { //加载操作 }});
网络状态监听
//oncreat
NetState receiver=new NetState(); IntentFilter filter=new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); this.registerReceiver(receiver, filter); receiver.onReceive(this, null);
//监听的那个类
public class NetState extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if(!gprs.isConnected() && !wifi.isConnected()) { AlertDialog.Builder ab=new AlertDialog.Builder(context); //设定标题 ab.setMessage("网络连接断开,请检查网络"); //设定退出按钮 //网络设置按钮 ab.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }).show(); }