Android开发之数据持久化存储三

一、目标

实现SD卡的文件存储,SD卡是否挂载的检查和SD卡剩余空间的查询

二、源程序代码

package com.example.qq_logindemo;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;

import java.io.File;
import java.io.FileOutputStream;

public class SDCardDemoActivity extends Activity implements View.OnClickListener {

    private Button writeDataBtn;
    private static final String TAG="SDCardDemoActivity";
    private Button checkSDCardBtn;
    private Button getFreeSDCardBtn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sd_card);
        if (Build.VERSION.SDK_INT>=23) {
            int REQUEST_CODE_CONTACT = 101;
            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            //验证是否许可权限
            for (String str : permissions) {
                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                    //申请权限
                    this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                    return;
                }
            }
        }
        initView();
        initOnClickListener();
    }

    private void initOnClickListener() {
        writeDataBtn.setOnClickListener(this);
        checkSDCardBtn.setOnClickListener(this);
        getFreeSDCardBtn.setOnClickListener(this);
    }

    private void initView() {
        getFreeSDCardBtn = this.findViewById(R.id.btn_get_free_sd_card);
        writeDataBtn = this.findViewById(R.id.btn_write_2_sd_card);
        checkSDCardBtn = this.findViewById(R.id.btn_check_sd_card);
    }

    @Override
    public void onClick(View v) {
        if (v==writeDataBtn) {
            //存储到SD卡
            File externalStorageDirectory = Environment.getExternalStorageDirectory();
            Log.d(TAG, "已经存储到 ---> "+externalStorageDirectory.toString());

            File filePath =new File("/storage/self/primary");
            File file =new File(filePath,"info.txt");
            try {
                FileOutputStream fos=new FileOutputStream(file);
                fos.write("heihei".getBytes());
                fos.close();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        else if (v == checkSDCardBtn) {
            //检查SD卡是否挂载
            String state = Environment.getExternalStorageState();

            if(state.equals(Environment.MEDIA_MOUNTED)){
                Log.d(TAG, "SD卡已经挂载");
            }else if (state.equals(Environment.MEDIA_UNMOUNTED)){
                Log.d(TAG, " SD卡已经删除");
            }
        }
        else if(v==getFreeSDCardBtn){
            File exFile = Environment.getExternalStorageDirectory();
            Log.d(TAG, "onClick: File Path ==="+exFile.toString());
            long freeSpace =exFile.getFreeSpace();
            //转换单位,把long转化成直观的  kb,Gb等
            String freeText= Formatter.formatFileSize(this,freeSpace);
            Log.d(TAG, "onClick: SD卡空余空间为:"+freeText);

        }

    }
}

SDCardDemoActivity

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_write_2_sd_card"
        android:layout_width="match_parent"
        android:text="存储到SD卡"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btn_check_sd_card"
        android:layout_width="match_parent"
        android:text="检查SD卡是否挂载"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btn_get_free_sd_card"
        android:layout_width="match_parent"
        android:text="SD卡剩余空间"
        android:layout_height="wrap_content"/>

</LinearLayout>

activity_sd_card

三、效果

四、心得体会

今天的学习给我留下了很深的印象,我了解到了Android系统在开发的时候向系统申请的权限十分重要!Android6.0以及6.0+往上的版本除了需要在ManiFest里面写下权限,还需要再activity里面写下动态的权限申请代码才行。由于我看的视频里面的模拟器版本和我的不太一样所以在寻找SD卡路径的时候非常费劲,不过有一个方法虽然已经过时了,但是还能用,可以直接获取SD卡的Path路径,即Environment.getExternalStorageDirectory()。

同时我又发现了一个困扰我很久的问题的答案,就是为什么编译器提醒的同名方法,名字相同只是后面括号中包括的内容不同在之后书写代码的时候会报错。原因是括号里面的东西是相应需要导的包,包导不对自然会报错咯。

今天没有学到多少东西,在寻找路径和通过命令行对Android的shell操作上面耽搁了太多时间,不过还是很有收获,还跟网课的老师进行了讨论,这是从来没有过的经历。总而言之明天需要加快进度才行,争取明天顺顺利利的解决Android端存储的学习。

原文地址:https://www.cnblogs.com/suanai/p/12260804.html

时间: 2024-10-12 19:01:58

Android开发之数据持久化存储三的相关文章

Android开发之数据持久化存储二

一.目标 以QQ登陆为例,继续完成昨天没有完成的任务,实现数据的存储和回显读取,并且学会往SD卡内存储信息 二.源程序代码 package com.example.qq_logindemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.Vie

Android开发-之数据的存储方式一

在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天就来详细的说一下以文件的形式存储,由于没有讲到数据库,在之后的课程中会讲到json格式存储在数据库中. 一.生成.txt文件 文件的生成无非就是我们Java中学习的输入输出流中的一部分,有Java基础相信都是很容易理解的,因为它真的很简单啦~~ 1.生成目录可以分为两种: 1)本机 2)SD卡 2.

iOS开发之数据持久化存储

概论 数据持久化存储:所谓持久化存储就是将数据保存到硬盘中,使得应用程序或者机器在重启后可以访问之前保存的数据. 常见方式: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite3(数据库) CoreData(苹果基于数据库封装的持久化存储工具,这种方式效率不高,因为会帮我们动态生成很多重复的代码,我只有写XMPP的时候会用一下,因为XMPP里面的存储用的就是CoreData) 沙盒 说到持久化存储就不得不说一下苹果的沙盒机制,苹果的

Android数据持久化存储

Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentProvider属于android四大组件之一,所以它的数据存储方式在介绍四大组件的时候说明. 1.文件存储 文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据. 文件存储有两种方式,一是存储到手机内存中(memor

Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/files/LoginTest.txt------/data/data/(包名)/files/(文件名) 导出的文件内容: 三.实现代码 新建一个Android 工程.这里我选择的是2.1即API 7,进行开发的,其它都是默认下一步下一步即可. /datasave/res/layout/activity

Android开发之数据存储的四种方式之SharedPreferences

Android项目开发中使用的数据存储方式有:网络存储.sqlite存储.File存储和SharedPreferences存 储,四种存储方式对应的Demo别人是NetworkDemo.SqliteDemo.FileDemo和SharedPreferencesDemo, 根据应用的场景选择其中一种或多种方式,比如在登录界面验证,需要将用户名和密码通过SharedPreferences方式保存,注册信息的时候需要通 过网络将数据存储到后台数据库中.结合一个登录界面的验证,使用SharedPrefe

数据持久化存储

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”. 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧.沙盒的目

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

Swift - 使用Core Data进行数据持久化存储

一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. 2,虽然其底层也是由类似于SQL的技术来实现,但我们不需要编写任何SQL语句,有点像Java开发中的Hibernate持久化框架 3,Core Data数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型. 4,与SQLite区别:只能取出整个实体记录,然后分解,