第三章 SD卡的存储与相关信息获取 2.1

1. java主函数代码

  1 package com.example.qq_login_demo;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.os.Environment;
  6 import android.text.format.Formatter;
  7 import android.util.Log;
  8 import android.view.View;
  9 import android.widget.Button;
 10 
 11 import androidx.annotation.Nullable;
 12 
 13 import java.io.File;
 14 import java.io.FileOutputStream;
 15 
 16 public class SDCardDemoActivity extends Activity implements View.OnClickListener {
 17 
 18     private Button mWriteDataBtn;
 19     private static final String TAG = "SDCardDemoActivity";
 20     private Button mCheckSdCardBtn;
 21     private Button mGetRemainingSize;
 22 
 23     @Override
 24     protected void onCreate(@Nullable Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         // 设置布局
 27         setContentView(R.layout.activity_sd);
 28         initView();
 29         initListener();
 30     }
 31 
 32     private void initListener() {
 33         // 这里原本的方法是写在onCreate方法中(即上一个方法),通过右键 + Refactor + Extract Method 可以将实现
 34         // 同类型的方法抽取出来,形成一个新的方法,有利于代码的封装
 35         mWriteDataBtn.setOnClickListener(this);
 36         mCheckSdCardBtn.setOnClickListener(this);
 37         mGetRemainingSize.setOnClickListener(this);
 38     }
 39 
 40     private void initView() {
 41         // 创建方法同initListener()
 42         mWriteDataBtn = (Button) this.findViewById(R.id.write_data_2_sd_card_btn);
 43         mCheckSdCardBtn = (Button) this.findViewById(R.id.sd_card_check);
 44         mGetRemainingSize = (Button) this.findViewById(R.id.get_sd_card_remaining_size);
 45     }
 46 
 47     @Override
 48     public void onClick(View v) {
 49         if (v == mWriteDataBtn) {
 50             // 数据写道SD卡上
 51             // 注意模拟器的的SD卡存储路径,和以前的不同
 52             File filePath = new File("/storage/emulated/0");
 53 
 54             // 然而在实际环境中,各个设备,厂商的SD卡路径往往不相同,此时需要获取SD卡的存储路径
 55             // 谷歌因此定义了一个api,以获取SD卡的存储路径
 56             // 输出的结果为: Ext-FilePath == /storage/emulated/0
 57             File externalStorageDirectory = Environment.getExternalStorageDirectory();
 58             Log.d(TAG, "Ext-FilePath == " + externalStorageDirectory.toString());
 59 
 60             File file = new File(filePath, "info.txt");
 61             FileOutputStream fout = null;
 62             try {
 63                 // 以特定的格式来存储账号密码
 64                 // 格式: username: password
 65                 fout = new FileOutputStream(file);
 66                 fout.write(("1502309758" + ": " + "cjy320723").getBytes());
 67                 fout.close();
 68             } catch (Exception e) {
 69                 e.printStackTrace();
 70             }
 71 
 72         }
 73 
 74         else if (v == mCheckSdCardBtn){
 75             // 此外,对于手机是否有SD卡,也需要获取
 76             // 点击的是检查是否有SD卡按钮
 77             // 通过查看方法说明,看出该字符串有八种状态
 78             String externalStorageState = Environment.getExternalStorageState();
 79             if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
 80                 Log.d(TAG, "SD卡已经挂载,也就是可用的");
 81             }
 82             else if (externalStorageState.equals(Environment.MEDIA_UNMOUNTED)){
 83                 Log.d(TAG, "SD卡已经退出挂载了");
 84             }
 85             // 对于低版本的Android,要想手机支持,需要在Gradle Scripts的build.gradle中将minSdkVersion属性调低
 86 
 87 
 88         }
 89 
 90         else if (v == mGetRemainingSize){
 91             File externalStorageDirectory = Environment.getExternalStorageDirectory();
 92             long freeSpace = externalStorageDirectory.getFreeSpace();
 93             long usableSpace = externalStorageDirectory.getUsableSpace();
 94             // 把long类型转换成直观的空间大小
 95             String freeSize = Formatter.formatFileSize(this, freeSpace);
 96             String usableSize = Formatter.formatFileSize(this,usableSpace);
 97             Log.d(TAG, "remaining = " + freeSize);
 98             Log.d(TAG, "usabelSize = " + usableSize);
 99             // 对于freeSpace和UsableSpace的区别:(详情可查看官方说明)
100             // freeSpace: 返回此抽象路径名命名的分区中未分配的字节数。
101             // 返回的未分配字节数是一个提示,但不能保证可以使用其中的大部分或任何字节。
102             // UsableSpace: 返回此抽象路径名命名的分区上此虚拟机可用的字节数。
103             // 如果可能,此方法将检查写入权限和其他操作系统限制,因此通常会比getFreeSpace更准确地估计实际可以写入多少新数据。
104         }
105     }
106 }

 

2. layout定义

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     >
 8 
 9     <Button
10         android:id="@+id/write_data_2_sd_card_btn"
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:text="往SD卡写数据"/>
14 
15     <Button
16         android:layout_width="match_parent"
17         android:layout_height="wrap_content"
18         android:text="检查是否支持SD卡"
19         android:id="@+id/sd_card_check" />
20 
21     <Button
22         android:layout_width="match_parent"
23         android:layout_height="wrap_content"
24         android:text="获取SD卡可用空间"
25         android:id="@+id/get_sd_card_remaining_size" />
26 
27 </LinearLayout>

 

上一篇:Jetpack Compose学习(3)——图标(Icon) 按钮(Button) 输入框(TextField) 的使用


下一篇:9.selenium元素