张萌&韩墨羽——SharedPreferences存储+SD卡存储
SharedPreferences存储+SD卡存储
SharedPreferences
特点:
保存少量的数据,且这些数据的格式非常简单。 存储5种原始数据类型: boolean, float, int, long, String
比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),记住密码功能,音乐播放器播放模式。
使用方式
**步骤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()或者apply()(推荐用这个.异步提交)
Editor其他方法: editor.clear() 清除数据 editor.remove(key) 移除指定key对应的数据
//SP写数据
private void write() { //TODO 1:得到SharedPreferences对象 //参数一 xml文件的名字 参数二 模式 MODE_PRIVATE 指定该SharedPreferences数据只能被本应用程序读写 SharedPreferences preferences = getSharedPreferences("songdingxing", MODE_PRIVATE); //TODO 2:获得编辑对象 SharedPreferences.Editor editor = preferences.edit(); //TODO 3:写数据 editor.putString("username","送定型"); editor.putInt("age",18); editor.putBoolean("isMan",false); editor.putFloat("price",12.4f); editor.putLong("id",5425054250l); //TODO 4:提交数据 editor.commit(); }读数据
//读数据
private void read() { //TODO 1:得到SharedPreferences对象 //参数一 xml文件的名字 参数二 模式 MODE_PRIVATE 指定该SharedPreferences数据只能被本应用程序读写 SharedPreferences preferences = getSharedPreferences("sgf", MODE_PRIVATE); //TODO 2:直接读取 //参数一 键 参数二 找不到的时候给默认值 String username=preferences.getString("username",""); int age=preferences.getInt("age",0); boolean isMan=preferences.getBoolean("isMan",false); float price=preferences.getFloat("price",0.0f); long id=preferences.getLong("id",0l); Toast.makeText(this, username+":"+age+":"+isMan+":"+price+":"+id, Toast.LENGTH_SHORT).show(); }登录注册案例
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>
java代码
package com.example.day008; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; import java.util.Map; public class MainActivity 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_main); 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("1705A",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("sgf".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(); } } } }); } }轮播图广告
import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import com.example.sevenday.Fragments.FourFragment; import com.example.sevenday.Fragments.oneFragment; import com.example.sevenday.Fragments.threeFragment; import com.example.sevenday.Fragments.twoFragment; import com.example.sevenday.activities.Main2Activity; import java.sql.Time; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { private SharedPreferences preferences; private ViewPager vpid; private RadioGroup radiogroup; private RadioButton b1; private RadioButton b2; private RadioButton b3; private RadioButton b4; private Button start; private TextView djsId; private List<Fragment> list=new ArrayList<>(); private int item=0;//默认显示页面 private int time=5; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what==102){ djsId.setText("倒计时"+(--time)+"秒"); if (time==0){ Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); } }else if (msg.what==101){ vpid.setCurrentItem(++item); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); preferences = getSharedPreferences("welcome", MODE_PRIVATE); boolean flag = preferences.getBoolean("isdone", false); if (flag){ Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); } vpid = (ViewPager) findViewById(R.id.vpid); radiogroup = (RadioGroup) findViewById(R.id.radiogroup); b1 = (RadioButton) findViewById(R.id.b1); b2 = (RadioButton) findViewById(R.id.b2); b3 = (RadioButton) findViewById(R.id.b3); b4 = (RadioButton) findViewById(R.id.b4); start = (Button) findViewById(R.id.start); djsId = (TextView) findViewById(R.id.djs_id); list.add(new oneFragment()); list.add(new twoFragment()); list.add(new threeFragment()); list.add(new FourFragment()); final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if (item!=list.size()-1){ handler.sendEmptyMessage(101); }else { timer.cancel(); } } },0,1000); vpid.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int i) { return list.get(i); } @Override public int getCount() { return list.size(); } }) ; //滑动事件 vpid.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int i) { if (i==0){ b1.setChecked(true); }else if (i==1){ b2.setChecked(true); }else if (i==2){ b3.setChecked(true); }else if (i==3){ b4.setChecked(true); } if (i==list.size()-1){ start.setVisibility(View.VISIBLE); djsId.setVisibility(View.VISIBLE); final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if (time>0){ handler.sendEmptyMessage(102); }else { timer.cancel(); } } },0,1000); }else { start.setVisibility(View.GONE); djsId.setVisibility(View.GONE); } } @Override public void onPageScrollStateChanged(int i) { } }); //点击事件 radiogroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId==R.id.b1){ vpid.setCurrentItem(0); }else if (checkedId==R.id.b2){ vpid.setCurrentItem(1); }else if (checkedId==R.id.b3){ vpid.setCurrentItem(2); }else if (checkedId==R.id.b4){ vpid.setCurrentItem(3); } } }); } //开始点击事件 public void startclick(View view) { Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); } }
文件存储:
内部文件存储openFileOutputFileOutputStream fileOutputStream = null; try { fileOutputStream = openFileOutput("aa.json", MODE_PRIVATE); fileOutputStream.write("hello".getBytes()); fileOutputStream.flush(); fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); }openFileInput
FileInputStream fileInputStream = null; try { fileInputStream= openFileInput("aa.json"); byte[] b = new byte[1024]; int len = 0; while((len = fileInputStream.read(b)) != -1){ Log.i(TAG, "onClick: "+new String(b,0,len)); } } catch (Exception e) { e.printStackTrace(); }
外部文件存储(SD卡)
必须要添加读写SD卡的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> package com.example.day008; import android.Manifest; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; public class MainActivity extends AppCompatActivity { private Button login; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String externalStorageState = Environment.getExternalStorageState(); Log.i(TAG, "onCreate: "+externalStorageState); File externalStorageDirectory = Environment.getExternalStorageDirectory(); Log.i(TAG, "onCreate: "+externalStorageDirectory.toString()); File externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); Log.i(TAG, "onCreate: "+externalStoragePublicDirectory); login = findViewById(R.id.login); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "onClick: "); //运行时权限 requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},100); if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //获取SD卡根路径: File file = Environment.getExternalStorageDirectory(); FileOutputStream out = null; try { //创建输出流 out = new FileOutputStream(new File(file, "json.txt")); out.write("呵呵呵俺哥哥".getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 100){ if(grantResults != null && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "不行啊", Toast.LENGTH_SHORT).show(); } } } }
改进后的代码
把文件操作写到同意授权的回调方法里.
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File file = Environment.getExternalStorageDirectory(); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(new File(file,"aa.json")); fileOutputStream.write("aaa".getBytes()); fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }else{ Toast.makeText(this, "没有权限", Toast.LENGTH_SHORT).show(); } }
(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; } } }
案例备注:
private void checkAccess(String access,int code){ //Manifest.permission.READ_EXTERNAL_STORAGE //检查当前权限(若没有该权限,值为-1;若有该权限,值为0) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int hasAccess = ContextCompat.checkSelfPermission(getApplication(), access); Log.e("PERMISION_CODE", hasAccess + "***"); if (hasAccess == PackageManager.PERMISSION_GRANTED) { // TODO: 2019/6/15 获得授权执行操作 if (code == 1) { write_json("json"); }else if(code == 2){ read_json(); } } else { //若没有授权,会弹出一个对话框(这个对话框是系统的,开发者不能自己定制),用户选择是否授权应用使用系统权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, code); // 第1个参数,当前上下文环境; // 第2个参数,需要授权的字符串数组; // 第3个参数,请求码requestCode,在回调方法中会用到。 } }else{ // TODO: 2019/6/15 非6.0直接使用 if (code == 1) { write_json("json"); }else if(code == 2){ read_json(); } } } //用户选择是否同意授权后,会回调这个方法 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // 第1个参数,请求码,对应上述方法的第3个参数; // 第2个参数,请求权限数组; // 第3个参数,请求权限的结果数组。 if(requestCode==1) { if (permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // TODO: 2019/6/15 获得授权执行操作 //http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1 write_json("json"); } else { // TODO: 2019/6/15 未获得授权执行的操作 finish(); } }else if(requestCode == 2){ if (permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // TODO: 2019/6/15 获得授权执行操作 //http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=10&page=1 read_json(); } else { // TODO: 2019/6/15 未获得授权执行的操作 finish(); } } }
- android 获取手机SD卡和手机的内部存储
- (转)【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 夜神模拟器SD卡文件存储位置
- Android 系统给应用分配的数据存储路径和SD卡的使用
- Android6.0 storage目录sd卡存储的路径创建
- 内部及外部SD卡存储空间存储
- 内部存储 SD卡存储 三级缓存
- android 存储方式(一) SD卡的存储
- 我的Android笔记(五)——调用相机并将照片存储到sd卡上
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
- 一个关于图片存储,操作SD卡的工具类
- 大过年的,不下班的,上个Android文件操作类(内部存储和sd卡均可)
- Android自学笔记-8-Android数据存储1:文件、SharedPreferences和获取sd卡信息
- Android学习笔记-获取手机内存,SD卡存储空间。
- android调用相机并将照片存储到sd卡上
- Android调用相机并将照片存储到sd卡上
- Android——数据存储(四种方式之二)读写SD卡——练习
- 把android assets文件夹内的文件存储到sd卡中
- Android 手机存储及sd卡操作--案例登录记住帐号密码
- android 获得手机外插SD卡 存储路径和存储空间