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>