键盘和数据存储

一、键盘处理
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卡的权限哦!





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

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文件中进行权限静态申请:

    
    

最后,就可以在该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下才能 联网等相关信息。

使用流程图

键盘和数据存储_第1张图片

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

实现流程图

键盘和数据存储_第2张图片

代码:

//获得第一个应用的包名,从而获得对应的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.简单的加密处理流程

流程图如下

键盘和数据存储_第3张图片

流程图解析

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("呵呵"));

你可能感兴趣的:(键盘和数据存储)