Android 9 讀寫SD卡文件

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sddemo">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Actvity 部分:
<?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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/read"
        android:hint="readFile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <EditText
        android:id="@+id/write"
        android:hint="writeFile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btRead"
        android:text="ReadFile"
        android:textAllCaps="false"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/btWrite"
        android:text="WriteFile"
        android:textAllCaps="false"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>


源碼部分:
package com.example.sddemo;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private static final String FILE_NAME="Arctan.txt";
    private static final int writeCode = 0x123;
    private static final int readCode = 0x456;
    private Button btRead;
    private Button btWrite;
    private EditText editW;
    private EditText editR;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btRead = findViewById(R.id.btRead);
        btWrite = findViewById(R.id.btWrite);
        editR = findViewById(R.id.read);
        editW = findViewById(R.id.write);
        Log.d(TAG, "onCreate: "+Environment.getExternalStorageDirectory());
        btWrite.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                MainActivity.writeCode);
            }
        });
        btRead.setOnClickListener(view->requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        MainActivity.readCode));
        
//        Log.d(TAG, "onCreate: "+ Environment.getExternalStorageDirectory());
    }

    private String read(){
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            File sdDir = Environment.getExternalStorageDirectory();
            try{
                FileInputStream fis = new FileInputStream(sdDir.getCanonicalPath()+"/"+FILE_NAME);

                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
                StringBuilder sb = new StringBuilder();
                String line = null;

                while((line=bufferedReader.readLine())!=null){
                    sb.append(line);
                }
                return sb.toString();

            }catch (IOException e){
                Log.d(TAG, "read:catch");
                e.printStackTrace();
            }
        }
        return null;
    }
    private void write(String content){
        File sdDir = Environment.getExternalStorageDirectory();
        try{
            Log.d(TAG, "write: path "+sdDir.getCanonicalPath());
            File targetFile = new File(sdDir.getCanonicalFile()+"/"+FILE_NAME);
            RandomAccessFile raf = new RandomAccessFile(targetFile,"rw");
            raf.seek(targetFile.length());
            raf.write(content.getBytes());
            raf.close();
        }catch (IOException e){

        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        Log.d(TAG, "onRequestPermissionsResult: peris "+Integer.toHexString(requestCode)+" pac "+ PackageManager.PERMISSION_GRANTED);
        if(requestCode == MainActivity.writeCode){
            if(grantResults != null && grantResults[0]==PackageManager.PERMISSION_GRANTED ){
                Log.d(TAG, "onRequestPermissionsResult: writeCode");
                write(editW.getText().toString());
            }else{
                Toast.makeText(MainActivity.this,R.string.write_warning,Toast.LENGTH_LONG).show();
            }

        }else if(requestCode == MainActivity.readCode){
            if(grantResults != null && grantResults[0]==PackageManager.PERMISSION_GRANTED ){
                Log.d(TAG, "onRequestPermissionsResult: readCode");
                editR.setText(read());
            }else{
                Toast.makeText(MainActivity.this,R.string.read_warning,Toast.LENGTH_LONG).show();
            }
        }


    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章