Android常用工具方法

一、描述

在项目中经常会遇到一些问题,网上搜到的一些比较好的解决方案,在这里分享出来。

二、方法集合


1 监听编辑框的回车事件
//对编辑框设置一个监听
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                //当actionId == XX_SEND 或者 XX_DONE时都触发
                //或者event.getKeyCode == ENTER 且 event.getAction == ACTION_DOWN时也触发
                //注意,这是一定要判断event != null。因为在某些输入法上会返回null。
                if (actionId == EditorInfo.IME_ACTION_SEND
                        || actionId == EditorInfo.IME_ACTION_DONE
                        || (event != null && KeyEvent.KEYCODE_ENTER == event.getKeyCode() && KeyEvent.ACTION_DOWN == event.getAction())) {
                    //处理回车事件...
                    
                }
                return true;
            }
        });


2 通知媒体库,有的通知方法在4.4前可以用,在之后就无效了,下面给出一个能够两个版本前后都解决的方法,(单个文件通知)
传入文件全路径,4.4之后的方法,之前也可以用
MediaScannerConnection.scanFile(activity,paths, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        //通知完成,处理自己的事情
                       
                    }
                });


3 对图片的完整性进行检查,项目中有遇到服务端返回无效图片,也被我下载下来了,所以在下载后需要对图片进行完整性检查。
        //图片路径
        String filePath = path;
        BitmapFactory.Options options = null;
        if (options == null) options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options); 
        if (options.mCancel || options.outWidth == -1
                || options.outHeight == -1) {
            //表示图片已损毁,
            
        } 


4 Snackbar用到的时候,虚拟键会挡住?
//用findViewById获取的这个view不会被挡住
View rootView = activity.findViewById(android.R.id.content)
Snackbar.make(rootView, "创建备忘成功,可以对新备忘进行打标签", Snackbar.LENGTH_SHORT).show();


5 获取软键盘的高度
SoftKeyBoardListener.getSoftKeyboardHeight(root, new SoftKeyBoardListener.OnGetSoftHeightListener() {
            @Override
            public void onShowed(int height) {
                //当软键盘弹出,返回软键盘高度
            }

            @Override
            public void onHide() {
                //当软键盘关闭
            }
        });
public class SoftKeyBoardListener {

  /**
   * 获取软键盘的高度 * *
   *
   * @param rootView *
   * @param listener
   */
  public static void getSoftKeyboardHeight(final View rootView, final OnGetSoftHeightListener listener) {
      final ViewTreeObserver.OnGlobalLayoutListener layoutListener
              = new ViewTreeObserver.OnGlobalLayoutListener() {
          @Override
          public void onGlobalLayout() {
              final Rect rect = new Rect();
              rootView.getWindowVisibleDisplayFrame(rect);
              final int screenHeight = rootView.getRootView().getHeight();
              final int heightDifference = screenHeight - rect.bottom;
              //设置一个阀值来判断软键盘是否弹出
              boolean visible = heightDifference > screenHeight / 3;
              if (visible) {
                  if (listener != null) {
                      listener.onShowed(heightDifference);
                  }
              } else {
                  if (listener != null) {
                      listener.onHide();
                  }
              }
          }
      };
      rootView.getViewTreeObserver().addOnGlobalLayoutListener(layoutListener);
  }

  public interface OnGetSoftHeightListener {
      void onShowed(int height);

      void onHide();
  }
}


6 高亮文本指定内容
/**
     *描述:返回指定高亮的文本,返回的直接用TextView.setText就ok
     * content : 内容
     * key : 需要高亮的文本
     * color : 高亮的颜色
     *邮箱:344176791@qq.com
     *日期:2017/9/24 下午4:39
     */
    public static SpannableStringBuilder getSpannableString(String content, String key, int color) {
        SpannableStringBuilder s = new SpannableStringBuilder(content);
        Pattern p = Pattern.compile(key);
        Matcher m = p.matcher(s);
        while (m.find()) {
            int start = m.start();
            int end = m.end();
            s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return s;
    }


7 保存InputStream数据到本地
public static void saveFile(String path, InputStream inputStream, onDownProgressListener onDownProgressListener) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(new File(file.getPath()));
            int len = 0;
            int sum = 0;
            byte[] buff = new byte[2048];
            while ((len = (inputStream.read(buff))) != -1) {
                outputStream.write(buff, 0, len);
                sum += len;
            }
            onDownProgressListener.onSuccess();
        } catch (FileNotFoundException e) {
            onDownProgressListener.onFail(e.getMessage());
        } catch (IOException e) {
            onDownProgressListener.onFail(e.getMessage());
        }
    }
8 Android6.0系统MAC地址获取的方法
/**
     * 获取手机的MAC地址
     * @return
     */
    public String getMac(){
        String str="";
        String macSerial="";
        try {
            Process pp = Runtime.getRuntime().exec(
                    "cat /sys/class/net/wlan0/address ");
            InputStreamReader ir = new InputStreamReader(pp.getInputStream());
            LineNumberReader input = new LineNumberReader(ir);

            for (; null != str;) {
                str = input.readLine();
                if (str != null) {
                    macSerial = str.trim();// 去空格
                    break;
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        if (macSerial == null || "".equals(macSerial)) {
            try {
                return loadFileAsString("/sys/class/net/eth0/address")
                        .toUpperCase().substring(0, 17);
            } catch (Exception e) {
                e.printStackTrace();

            }

        }
        return macSerial;
    }
    public static String loadFileAsString(String fileName) throws Exception {
        FileReader reader = new FileReader(fileName);
        String text = loadReaderAsString(reader);
        reader.close();
        return text;
    }
    public static String loadReaderAsString(Reader reader) throws Exception {
        StringBuilder builder = new StringBuilder();
        char[] buffer = new char[4096];
        int readLength = reader.read(buffer);
        while (readLength >= 0) {
            builder.append(buffer, 0, readLength);
            readLength = reader.read(buffer);
        }
        return builder.toString();
    }

三、总结

如果有类似的方法或技术点,也可以留言分享,谢谢!
欢迎关注我的微信公众号,分享更多技术文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,400评论 25 707
  • 卷帘门打开的那一刻 又开始重复起,每天不变的工作 起始在别人梦乡里的生活 总带着一些,不切实际的颜色 眼看着空旷的...
    水摇绢阅读 414评论 0 1
  • 和平街凤尾巷在鸣江镇是出了名的,镇上村里乡下无人不晓。但凡有人提起凤尾巷,没人不吸着鼻子,晃着脑袋,叹言:“这凤尾...
    北洋有极星阅读 439评论 0 0
  • 白雪皑皑覆坤灵, 远近高低甚相同。 万尘身影已无踪, 洁净似玉舒心情。
    籍梦阅读 463评论 0 1