键盘和数据存储

一、键盘处理
1)、显示或隐藏键盘

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_FORCED); //显示键盘      
imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘

二、存储操作

1)、向SD卡中读、写数据

//往SD卡写入文件的方法
 public void savaFileToSD(String filename, String filecontent) throws Exception { 

      //如果手机已插入sd卡,且app具有读写sd卡的权限
       if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

             filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
             //这里就不要用openFileOutput了,那个是往手机内存中写数据的
              FileOutputStream output = new FileOutputStream(filename); 

            //将String字符串以字节流的形式写入到输出流中
            output.write(filecontent.getBytes()); 

            //关闭输出流
             output.close();  
      } else 
            Toast.makeText(context, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
}


 //读取SD卡中文件的方法 //定义读取文件的方法: 
public String readFromSD(String filename) throws IOException { 
      StringBuilder sb = new StringBuilder("");
      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

             filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;

             //打开文件输入流
             FileInputStream input = new FileInputStream(filename); byte[] temp = new byte[1024]; 
             int len = 0; 

             //读取文件内容:
             while ((len = input.read(temp)) > 0) {

                      sb.append(new String(temp, 0, len));
             } 

            //关闭输入流 
            input.close();
      } 
      return sb.toString(); 
}

最后别忘记在AndroidManifest.xml写上读写SD卡的权限哦!

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

注意,将其放在<application>标签之外。

2)、无法读取文件

Android开发中,API23或以上版本读写文件时可能会出现如下错误:
open failed: EACCES (Permission denied)
或者无法正常读取文件即使你已经在注册文件AndroidManifest.xml中添加了相应的读写权限。
原因在于API23或以上版本需要进行动态权限申请,具体申请过程如下:

动态申请权限
在需要申请权限的Activity中添加一个权限申请函数:

private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = { 
           Manifest.permission.READ_EXTERNAL_STORAGE,
           Manifest.permission.WRITE_EXTERNAL_STORAGE };


public static void verifyStoragePermissions(Activity activity) {  
          // Check if we have write permission   
          int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);   

          if (permission != PackageManager.PERMISSION_GRANTED) {
          // We don't have permission so prompt the user      
          ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);    

        }
}

同时,此时仍然需要在注册文件AndroidManifest.xml文件中进行权限静态申请:

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

最后,就可以在该Activity中通过调用函数verifyStoragePermissions(this)进行权限动态申请,从而达到可以读取文件的目的。

3)、向内存中读、写数据

 //这里定义的是一个文件保存的方法,写入到文件中,所以是输出流 
 public void save(String filename, String filecontent) throws Exception {

         //这里我们使用私有模式,创建出来的文件只能被本应用访问,还会覆盖原文件
         FileOutputStream output = mContext.openFileOutput(filename, Context.MODE_PRIVATE);

          //将String字符串以字节流的形式写入到输出流中
         output.write(filecontent.getBytes());

          //关闭输出流 
         output.close();
         
} 



/**这里定义的是文件读取的方法 **/
 public String read(String filename) throws IOException {

      //打开文件输入流
       FileInputStream input = mContext.openFileInput(filename);
       byte[] temp = new byte[1024]; 
       StringBuilder sb = new StringBuilder(""); 
       int len = 0; 

        //读取文件内容:
        while ((len = input.read(temp)) > 0) { 
                 sb.append(new String(temp, 0, len));

       }

     //关闭输入流 
      input.close();
      return sb.toString();
}

*4)、读取raw和assets文件夹下的文件
相信大家对两个文件夹并不陌生,如果我们不想自己的文件被编译成二进制文件的话, 我们可以把文件放到这两个目录下,而两者的区别如下:

res/raw:文件会被映射到R.java文件中,访问的时候直接通过资源ID即可访问,而且 他不能有目录结构,就是不能再创建文件夹
assets:不会映射到R.java文件中,通过AssetManager来访问,能有目录结构,即, 可以自行创建文件夹

读取文件资源:
res/raw

InputStream is =getResources().openRawResource(R.raw.filename); 

assets

AssetManager am = getAssets(); 
InputStream is = am.open("filename");

三、SharedPreferences 用户偏好参数

1)、
使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息。

使用流程图

2)、读取其他应用的SharedPreferences
核心: 获得其他app的Context,而这个Context代表访问该app的全局信息的接口,而决定应用的唯一标识 是应用的包名,所以我们可以通过应用包名获得对应app的Context 另外有一点要注意的是:其他应用的SP文件是否能被读写的前提就是SP文件是否指定了可读或者 可写的权限,我们上面创建的是MODE_PRIVATE的就不可以了~所以说你像读别人的SP里的数据, 很难,另外,一些关键的信息,比如密码保存到SP里,一般都是会做加密的,所以只能自己写自己玩

实现流程图

代码:

//获得第一个应用的包名,从而获得对应的Context,需要对异常进行捕获 

try { 
        othercontext = createPackageContext("com.jay.sharedpreferencedemo", Context.CONTEXT_IGNORE_SECURITY); 

        } catch (PackageManager.NameNotFoundException e) {
                     e.printStackTrace();

 }

 //根据Context取得对应的
SharedPreferences sp = othercontext.getSharedPreferences("mysp", Context.MODE_WORLD_READABLE); 
String name = sp.getString("username", ""); 
String passwd = sp.getString("passwd", "");

** 3)、使用MD5对SharedPreference的重要数据进行加密**
加密解密地址:http://www.cmd5.com/

1.简单的加密处理流程

流程图如下

流程图解析

Step 1.用户注册账号密码,账号密码校验后(账号是否重复,密码位数 > 6位等), 即账号密码有效,注册成功后,我们提交给服务器的账号,以及本地加密过的密码!
Step 2.服务器端将用户提交的账号,加密过的密码保存到服务端的数据库中,也就是服务 端并不会保存我们的明文密码(原始)密码!
Step 3.说回客户端,如果注册成功或者登陆成功,你想保存账号密码到SP中,保存的的密码 也需要走一趟加密流程!即明文密码——>加密,再保存!如果不保存,每次请求的时候,明文密码 也要走一趟家里流程,然后拿着加密后的密码来请求服务器!
Step 4.服务器验证账号以及加密密码,成功,分配客户端一个session标识,后续客户端可以拿着 这个session来访问服务端提供的相关服务!

程序:

public static String getMD5(String content) {  
        try {        
                MessageDigest digest = MessageDigest.getInstance("MD5");   
                digest.update(content.getBytes());     
                return getHashString(digest);    

         } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();

        }
        return null;
}

private static String getHashString(MessageDigest digest) {
    StringBuilder builder = new StringBuilder();
    for (byte b : digest.digest()) {
        builder.append(Integer.toHexString((b >> 4) & 0xf));
        builder.append(Integer.toHexString(b & 0xf));

    }
    return builder.toString();
}

MainActivity.java直接调用getMD5这个静态方法:

Log.e("HeHe", MD5.getMD5("呵呵"));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,216评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,337评论 19 139
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,776评论 9 468
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,851评论 6 13
  • 谁不是用快乐换取落魄 最后还是一个人生活 不要说什么沦落 只不过是一个人莫名的寂寞 风吹落日颠簸 伤心情歌给谁点播...
    koko空空阅读 1,300评论 2 2