Android存储卡读写文件与Application数据保存的实现介绍

目录
  • 一、在存储卡上读写图片文件
  • 二、Application
    • 1、Application生命周期
    • 2、利用Application操作全局变量

一、在存储卡上读写图片文件

Android的位图工具是Bitmap,App读写Bitmap可以使用性能更好的BufferedOutputStream和BufferedInputStream。

Android还提供了BitmapFactory工具用于读取各种来源的图片,相关方法如下:

  1. decodeResource:该方法可从资源文件中读取图片信息。
  2. decodeFile:该方法可将指定路径的图片读取到Bitmap对象。
  3. decodeStream:该方法从输入流中读取位图数据。

例:点击保存再点击读取后出现图片

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存"/>
    <Button
        android:id="@+id/btn_read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取"/>
    <ImageView
        android:id="@+id/iv_content"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:scaleType="fitCenter"/>
</LinearLayout>

java代码

public class ImageWriteActivity extends AppCompatActivity implements View.OnClickListener {
    private ImageView iv_content;
    private String path;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_write);
        iv_content = findViewById(R.id.iv_content);
        findViewById(R.id.btn_save).setOnClickListener(this);
        findViewById(R.id.btn_read).setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_save:
                String fileName = System.currentTimeMillis()+".jpeg";
//                获取当前APP的私有下载目录
                path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString()+ File.separatorChar+fileName;
//                从指定的资源文件中获取位图对象
                Bitmap b1 = BitmapFactory.decodeResource(getResources(),R.drawable.thing1);
//                把位图对象保存为图片文件
                FileUtil.saveImage(path,b1);
                Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_read:
                Bitmap b2 = FileUtil.openImage(path);
                iv_content.setImageBitmap(b2);
                break;
        }
    }
}

FileUtil类

public class FileUtil {
    //    把位图数据保存到指定路径的图片文件
    public static void saveImage(String path, Bitmap bitmap) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(path);
//            把文件数据压缩到文件输出流
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //从指定路径的图片文件中读取位图数据
    public static Bitmap openImage(String path) {
        Bitmap bitmap = null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(path);
            bitmap = BitmapFactory.decodeStream(fis);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bitmap;
    }
}

二、Application

1、Application生命周期

Application是Android的一大组件,在App运行过程中有且仅有一个Application对象贯穿整个生命周期。

清单文件AndroidMainifest.xml文件中有个application标签,没有指定则使用默认;

可以新建一个MyApplication类继承Application,然后在清单文件中加入以下代码指定使用自定义的application。

android:name=".MyApplication"

MyApplication类

public class MyApplication extends Application {
//App启动时调用
    public void onCreate() {
        super.onCreate();
        mApp = this;
    }
//App终止调用
    @Override
    public void onTerminate() {
        super.onTerminate();
    }
//App配置改变调用,如竖屏变为横屏
    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
}

2、利用Application操作全局变量

全局的意思是其他代码都可以引用该变量,因此全局变量是共享数据和消息传递的好方法。

适合在Application中保存的全局变量主要有:

  • 会频繁读取的信息,如用户名、手机号等。
  • 不方便由意图传递的数据,如位图对象、非字符串类型的集合对象等。
  • 容易因频繁分配内容而导致内存泄漏的对象,如Handler对象等。

例:输入信息点击保存,只要应用不挂掉,重新回到应用还会有输入的信息。

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="姓名"
            android:textSize="17sp"/>
        <EditText
            android:id="@+id/et_name"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:hint="请输入姓名"
            android:inputType="text"
            android:textSize="17sp"/>
    </LinearLayout>
    <Button
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存"
        android:textSize="17sp"/>
</LinearLayout>

java类

public class AppWriteActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText et_name;
    private MyApplication app;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app_write);
        et_name = findViewById(R.id.et_name);
        app = MyApplication.getInstance();
        findViewById(R.id.btn_save).setOnClickListener(this);
        reload();
    }
    private void reload() {
        String name = app.infoMap.get("name");
        if(name == null)
            return;
        et_name.setText(name);
    }
    @Override
    public void onClick(View view) {
        String name = et_name.getText().toString();
        app.infoMap.put("name",name);
    }
}

MyApplication类

public class MyApplication extends Application {
    private static MyApplication mApp;
//    声明一个公共的信息映射对象,可当作全局变量使用
    public HashMap<String,String> infoMap = new HashMap<>();
    public static MyApplication getInstance(){
        return mApp;
    }
//App启动时调用
    public void onCreate() {
        super.onCreate();
        mApp = this;
    }
//App终止调用
    @Override
    public void onTerminate() {
        super.onTerminate();
    }
//App配置改变调用,如竖屏变为横屏
    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
}

到此这篇关于Android存储卡读写文件与Application数据保存的实现介绍的文章就介绍到这了,更多相关Android存储卡读写文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Application级别自定义Toast

    在Android开发过程中,有时会需要一些消息提示,大多数情况可以用dialog来做,但有些消息不需要用户去点击取消并且不能对用户体验产生影响的提示,就需要toast来做了.但可惜的是,toast是系统级的,凡是涉及到系统的又会涉及到其他APP,有些定制系统可以对App的消息通知进行设置,一旦禁止了APP的通知toast则不会显示.而且在Android 7以后toast还需要申请权限麻烦死了有木有,劳资就想安安静静的提示一下有这么麻烦吗!所以,本人特地研究了下能在Application级别不受限

  • Android获取内外置存储卡的方法

    以前的Android(4.1之前的版本)中,SDcard跟路径通过"/sdcard"或者"/mnt/sdcard"来表示存储卡,而在Jelly Bean系统中修改为了"/storage/sdcard0",以后可能还会有多个SDcard的情况. 目前为了保持和之前代码的兼容,sdcard路径做了link映射. 为了使您的代码更加健壮并且能够兼容以后的Android版本和新的设备,请通过Environment.getExternalStorageDi

  • 一文带你看懂Android Application启动流程是怎样的

    基于Android11-API30 总览 获取applicationThread,AMS这两个Binder2.attach时,将获取applicationThread对象也传递到AMS进程,请求远程调用通知AMS应用进程想要创建Application,此时AMS为服务端 AMS收到消息,请求调用applicationThread的远程接口,此时AMS为客户端 applicationThread收到AMS的请求,通过Handler发起创建Application的处理任务,后面就没有远程接口调用了

  • Android动态替换Application实现

    背景 虽然热更新和Hook技术都被大家聊烂了,但是还是想和大家聊一下这方面的内容.最近做一些Android方面的优化工作,大家知道Android的ClassLoader在加载dex文件的过程中,而AndroidManifest的Application类就在dex文件中,Application通常会做一些全局的初始化工作,在加载dex之前,我们需要替换原有的Application为ProxyApplication.使其应用启动时加载ProxyApplication,然后在其中实现加载dex等一些流

  • Android获得内/外置存储卡路径的方法

    我们知道Android上一般都有外置的存储卡, 但是通过Environment.getExternalStorageDirectory()获取的是内置的存储卡位置 (也有的手机可以在系统中修改默认存储) 那么如何获取外置存储卡的位置呢? 我们可以通过StorageManager来获取多个外置sdcard,代码如下: StorageManager storageManager = (StorageManager) cxt.getSystemService(Context.STORAGE_SERVI

  • Android ndk获取手机内部存储卡的根目录方法

    如下所示: jclass envcls = env->FindClass("android/os/Environment"); //获得类引用 if (envcls == nullptr) return 0; //找到对应的类,该类是静态的返回值是File jmethodID id = env->GetStaticMethodID(envcls, "getExternalStorageDirectory", "()Ljava/io/File;&

  • Android开发案例手册Application跳出dialog

    目录 实践过程 场景还原 开始 可能会遇见的bug 实践过程 场景还原 线程中监测和硬件的连接,在任何断开的话需要弹出框给用户选择是否重新连接. 所以我们的思路就是不使用依托于Activity的Dialog,而是使用依托于Aplication的Dialog. 开始 首先是动态申请权限 <!--这行代码必须存在,否则点击不了系统设置中的按钮--> <uses-permission android:name="android.permission.SYSTEM_ALERT_WIND

  • Android存储卡读写文件与Application数据保存的实现介绍

    目录 一.在存储卡上读写图片文件 二.Application 1.Application生命周期 2.利用Application操作全局变量 一.在存储卡上读写图片文件 Android的位图工具是Bitmap,App读写Bitmap可以使用性能更好的BufferedOutputStream和BufferedInputStream. Android还提供了BitmapFactory工具用于读取各种来源的图片,相关方法如下: decodeResource:该方法可从资源文件中读取图片信息. deco

  • Android读取XML文件中的数据

    本文实例为大家分享了Android读取XML文件中数据的具体代码,供大家参考,具体内容如下 读取XML中存储的数据.将xmlfile.xml存放在assets文件夹中.在activity_main.xml中创建一个textview,用来显示读取到的数据. XML文件内容如下:xmlfile.xml <?xml version="1.0" encoding="UTF-8"?> <Languages cat="it"> <

  • android 识别U盘以及读写文件的方法

    android中读写文件的需求地方很多,其中就包括了识别U盘,弹出U盘,读写U盘的文件等. 那么,如何实现这些需求呢?笔者简单的说下: 1.识别U盘: 识别U盘的方法只要是用到了2个android官方类. 它们分别为:ContentResolver和AsyncQueryHandler.表现为前者提供内容给后者读取. 作法如下: 1)获取状态并遍历 contentObserver = new ContentObserver(mHandler) { @Override public void onC

  • Android学习之文件存储读取

    前言 相信大家都知道知道,在AndroidOS中,提供了五中数据存储方式,分别是:ContentProvider存储.文件存储.SharedPreference存储.SQLite数据库存储.网络存储.那么这一篇,我们介绍文件存储. 1.Android文件的操作模式 学过Java的同学都知道,我们新建文件,然后就可以写入数据了,但是Android却不一样,因为Android是 基于Linux的,我们在读写文件的时候,还需加上文件的操作模式,Android中的操作模式如下: 2.文件的操作模式 我们

  • Android Studio报:“Attribute application@theme or @ icon ”问题的解决

    前言 Android Studio是Google开发的一款面向Android开发者的IDE,支持Windows.Mac.Linux等操作系统,基于流行的Java语言集成开发环境IntelliJ搭建而成. 发现问题 最近在做项目的时候需要导入第三方库时碰到这个问题 Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : Attribute application@theme va

  • 利用pandas向一个csv文件追加写入数据的实现示例

    我们越来越多的使用pandas进行数据处理,有时需要向一个已经存在的csv文件写入数据,传统的方法之前我也有些过,向txt,excel文件写入数据,传送门:Python将二维列表(list)的数据输出(TXT,Excel) pandas to_csv()只能在新文件写数据?当然不是! pandas to_csv() 是可以向已经存在的具有相同结构的csv文件增加dataframe数据. df.to_csv('my_csv.csv', mode='a', header=False) to_csv(

  • PHP如何从txt文件中读取数据详解

    目录 一.打开/关闭文件 二.读写文件 1.读取整个文件 2.读取一行数据 3.读取一个字符 4.读取任意长度的字符串 总结 一.打开/关闭文件 1.对文件操作时首先要打开文件,打开文件用 fopen()函数,语法是: fopen(filename,mode,include_path,context); 2.对文件操作结束后应该关闭这个文件,使用函数 fclose(); 例如: 二.读写文件 1.读取整个文件 有三个函数可以使用,分别是:readfile()函数.file()函数.file_ge

  • Android如何监测文件夹内容变化详解

    目录 一. 概述: 二. 监听的事件类型: 三.实例 总结 一. 概述: android.os包下的FileObserver类是一个用于监听文件访问.创建.修改.删除.移动等操作的监听器,基于linux的INotify.FileObserver是个抽象类,必须继承它才能使用.每个FileObserver对象监听一个单独的文件或者文件夹,如果监视的是一个文件夹,那么文件夹下所有的文件和级联子目录的改变都会触发监听的事件. FileObserver简介Android.os包下的FileObserve

  • 教你如何通过日志文件恢复MySQL数据

    目录 前言 1.找到最新的 binlog 文件 2.找到我们想恢复数据在日志文件里的开始结束位置 2.1.使用时间范围 2.2.使用 position 范围 3.恢复 3.1 通过时间恢复 3.2 通过 position 恢复 总结 前言 本文将讲述怎么通过 MySql 的日志 binlog 文件进行数据恢复. 通过已备份数据 加上 binlog 文件恢复上次备份到删除之间的数据 1.找到最新的 binlog 文件 进入 mysql 命令行执行如下命令 mysql> show master st

  • Vue中请求本地JSON文件并返回数据的方法实例

    目录 1.目录结构 2.检查一下自己是否安装了 json-server(以下截图代表安装了) 3.安装完成以后我们就可以运行自己的json文件了 4.看看浏览器里的数据呈现效果吧 5.为了保险起见,我还特地去 postman 上测试了一下(可以省略这步) 6.现在我们可以编写代码发送请求来获取数据啦 7.在控制台就可以看到我们数据请求回来了 总结 1.目录结构 直接在根目录下创建自己的JSON文件,在此我的JSON文件名为data.json 以下是我的JSON文件内容(此处是参照的黑马程序员的v

随机推荐