8 第八单元 SharedPreferences存储

本文详细介绍了Android6.0运行时权限的添加思路与操作方法,包括判断API版本、授权状态及开启授权流程。同时,深入探讨了SharedPreferences与文件存储(内部+外部)的应用,涵盖数据存储、读取、删除与清空技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何添加Android 6.0运行时权限

思路:

1、编写简单的程序,判断API版本是否是6.0以上
2、如果是,判断是否授权,没有授权开启授权流程

判断SDK的版本:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)

参数介绍
Build.VERSION.SDK_INT :SDK版本
Build.VERSION_CODES.M:常量23,即android 6.0 对应得API版本号

如:

int permission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

permission==PackageManager.PERMISSION_GRANTED:表示已经授权

permission==PackageManager.PERMISSION_DENIED:表示没有权限

如果未授权,提示用户手动授权

Intent intent = new Intent(activity, PermissionsActivity.class);
 intent.putExtra(“参数名”,  “参数值”);
startActivityForResult(activity, intent, requestCode, null);

参数介绍
参数名:自定义
参数值:Manifest.permission.WRITE_EXTERNAL_STORAGE

接收处理结果

public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
setResult(0);//授权成功
setResult(-1);//授权拒绝
   } 

一、SharedPreferences

1.sp的介绍

  • 保存少量的数据,且这些数据的格式非常简单。 存储5种原始数据类型: boolean, float, int, long, String

  • 比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),记住密码功能,音乐播放器播放模式。

  • 存哪了: /data/data/应用程序包名/shared_prefs/Xxx.xml文件,以Key-Value的格式存储

  • 技能要点: (1)如何存储数据 (2)如何获取数据
    2.如何储存数据

    步骤1:
    得到SharedPreferences对象 getSharedPreferences(“文件的名称”,“文件的类型”);
    (1).Context.MODE_PRIVATE:指定该SharedPreferences数据只能被应用程序读写
    (2)MODE_APPEND:检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
    (3).Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他
    应用程序读,但不能写。
    (4).Context,MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序写,但不能读。
    步骤2:
    得到 SharedPreferences.Editor编辑对象 SharedPreferences.Editor
    editor=sp.edit();
    步骤3:
    添加数据 editor.putBoolean(key,value)
    editor.putString() editor.putInt() editor.putFloat()
    editor.putLong()
    步骤4:
    提交数据 editor.commit() Editor其他方法:

    editor.clear() 清除数据 editor.remove(key) 移除指定key对应的数据

如何使用SharedPreference,写入,读取,删除,清空

public class MainActivity extends AppCompatActivity {
    Button button1;
    Button button2;
    Button button3;
    Button button4;
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1 = findViewById(R.id.bt1);
        button2 = findViewById(R.id.bt2);
        button3 = findViewById(R.id.bt3);
        button4 = findViewById(R.id.bt4);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得SharedPreferences对象
                //参数一 文件名 参数二 权限
                final SharedPreferences sharedPreferences = getSharedPreferences("1704A", Context.MODE_PRIVATE);
                //通过SharedPreferences对象获取edit
                final SharedPreferences.Editor edit = sharedPreferences.edit();
                //得到 SharedPreferences.Editor编辑对象 SharedPreferences.Editor
                edit.putString("name","小明");//添加数据 参数一 键名 数据
                edit.putInt("age",18);
                //提交
                edit.commit();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得SharedPreferences对象
                //参数一 文件名 参数二 权限
                final SharedPreferences sharedPreferences = getSharedPreferences("1704A", Context.MODE_PRIVATE);
                //读取数据 参数一 键名 参数二 默认值
                final String name = sharedPreferences.getString("name", "大米");
                final int age = sharedPreferences.getInt("age", 100);
                //吐司
                Toast.makeText(MainActivity.this, ""+name+age, Toast.LENGTH_SHORT).show();
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得SharedPreferences对象
                //参数一 文件名 参数二 权限
                final SharedPreferences sharedPreferences = getSharedPreferences("1704A", MODE_PRIVATE);
                //通过SharedPreferences对象获取edit
                final SharedPreferences.Editor edit = sharedPreferences.edit();
                //删除name键的数据
                edit.remove("name");
                //提交
                edit.commit();
            }
        });
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获得SharedPreferences对象
                //参数一 文件名 参数二 权限
                final SharedPreferences sharedPreferences = getSharedPreferences("1704A", MODE_PRIVATE);
                //通过SharedPreferences对象获取edit
                final SharedPreferences.Editor edit = sharedPreferences.edit();
                //清空
                edit.clear();
                //提交
                edit.commit();

            }
        });


    }
}

案例思路解析

在这里插入图片描述

记住密码

二.文件存储:内部文件存储+外部文件存储(SD卡)(******)

(1)xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity"
    android:orientation="vertical"
    android:gravity="center">
    <EditText
    android:layout_marginLeft="50dp"
    android:layout_marginRight="50dp"
    android:id="@+id/username"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
    <EditText
    android:layout_marginLeft="50dp"
    android:layout_marginRight="50dp"
    android:id="@+id/password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
    <RelativeLayout
    android:layout_marginLeft="50dp"
    android:layout_marginRight="50dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
        <CheckBox
    android:layout_alignParentLeft="true"
    android:id="@+id/cb_remember"
    android:text="记住密码"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
        <Button
    android:layout_alignParentRight="true"
    android:id="@+id/login"
    android:text="登录"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
    </RelativeLayout>
</LinearLayout>

(2)Java代码

public class LoginActivity extends AppCompatActivity {
    private SharedPreferences sharedPreferences;
    private EditText username;
    private EditText password;
    private CheckBox cb;
    private Button login;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);
        cb=(CheckBox)findViewById(R.id.cb_remember);
        login=(Button)findViewById(R.id.login);
        //TODO 读取
        sharedPreferences=getSharedPreferences("1609A",MODE_PRIVATE);
        boolean ischeck= sharedPreferences.getBoolean("ischeck",false);
        if(ischeck){
            //读到用户名和密码展现在页面中,复选框被勾选
            String username1=sharedPreferences.getString("username","");
            String password1=sharedPreferences.getString("password","");
            username.setText(username1);
            password.setText(password1);
            cb.setChecked(true);
        }
        //TODO 写数据
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username2=username.getText().toString().trim();
                String password2=password.getText().toString().trim();
                //用户名和密码是否正确
                if("songdingxing".equals(username2)&&"123456".equals(password2)){
                    //判断记住密码是否被选中
                    if(cb.isChecked()){//存
                        SharedPreferences.Editor edit = sharedPreferences.edit();
                        edit.putBoolean("ischeck",true);
                        edit.putString("username",username2);
                        edit.putString("password",password2);
                        edit.commit();

                    }else{//清空
                        SharedPreferences.Editor edit = sharedPreferences.edit();
                        edit.putBoolean("ischeck",false);
                        edit.commit();
                    }
                }
            }
        });
    }
}

1.手机内存图

在这里插入图片描述

2.SD卡介绍:

1.一般手机文件管理 根路径 /storage/emulated/0/或者/mnt/shell/emulated/0
在这里插入图片描述
2.重要代码:
(1)Environment.getExternalStorageState();// 判断SD卡是否
(2)Environment.getExternalStorageDirectory(); 获取SD卡的根目录
(3)Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 获取SD卡公开目录pictures文件夹

3.必须要添加读写SD卡的权限

SD卡权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>SD卡权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3.代码

(1)添加读写SD卡的 权限
(2)FileUtils.java:四个方法:实现向SD卡中读写Bitmap图片和json字符串

public class FileUtils {
    //方法1:向SD卡中写json串
    public static void write_json(String json)  {
        //判断是否挂载
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            //获取SD卡根路径:mnt/shell/emulated/0
            File file=Environment.getExternalStorageDirectory();
            FileOutputStream out=null;
            try {
                //创建输出流
                out= new FileOutputStream(new File(file,"json.txt"));
                out.write(json.getBytes());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(out!=null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
    }
    //方法2:从SD卡中读取json串
    public static String read_json() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File file = Environment.getExternalStorageDirectory();
            FileInputStream inputStream = null;
            StringBuffer sb=new StringBuffer();
            try {
                inputStream=new FileInputStream(new File(file,"json.txt"));
                byte[] b=new byte[1024];
                int len=0;
                while((len=inputStream.read(b))!=-1){
                    sb.append(new String(b,0,len));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(inputStream!=null){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return  sb.toString();
        }else{
            return "";
        }
    }

    //方法3:从SD卡中读取一张图片
    public  static  Bitmap read_bitmap(String filename) {//filename图片名字
        Bitmap bitmap=null;
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            File file=Environment.getExternalStorageDirectory();
            File file1 = new File(file, filename);
            //BitmapFactory可以直接根据SD卡图片路径转成一个bitmap对象
            bitmap= BitmapFactory.decodeFile(file1.getAbsolutePath());
        }
        return bitmap;
    }
    //方法4:网络下载一张图片存储到SD卡中
    public  static  void write_bitmap(String url) {//网址
        new MyTask().execute(url);
    }
    static class MyTask extends AsyncTask<String,String,String> {
        @Override
        protected String doInBackground(String... strings) {
            FileOutputStream out=null;
            InputStream inputStream=null;//网络连接的输入流
            HttpURLConnection connection=null;//向SD卡写的输出流
            try {
                URL url= new URL(strings[0]);
                connection= (HttpURLConnection) url.openConnection();
                connection.setConnectTimeout(5*1000);
                connection.setReadTimeout(5*1000);
                if (connection.getResponseCode()==200){
                    inputStream = connection.getInputStream();
                    //TODO 获取SD卡的路径
                    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//是否挂载
                        File file = Environment.getExternalStorageDirectory();
                        out = new FileOutputStream(new File(file,"xiaoyueyue.jpg"));
                        byte[] bytes=new byte[1024];
                        int len=0;
                        while((len=inputStream.read(bytes))!=-1){
                            out.write(bytes,0,len);
                        }
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                //关流
                if(out!=null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(inputStream!=null){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(connection!=null){
                    connection.disconnect();
                }
            }
            return null;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值