안드로이드

 

 

 

class SdcardActivity

 

package com.example.choi.ex04_file;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
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.InputStreamReader;


public class SdcardActivity extends AppCompatActivity {

    //1.변수 선언
    Button btnSave, btnLoad, btnDelete;
    EditText edit1;
    String path;  //sdcard 의 경로


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.read_write);

        //2. 위젯 연결
        btnSave=(Button)findViewById(R.id.btnSave);
        btnLoad=(Button)findViewById(R.id.btnLoad);
        btnDelete=(Button)findViewById(R.id.btnDelete);
        edit1=(EditText)findViewById(R.id.edit1);

        //sdcard의 절대 경로(안드로이드 버전, 제조사마다 디렉토리가 다름)
        path = Environment.getExternalStorageDirectory().getAbsolutePath();

        //아래 처럼 절대 경로로 하면 안된다. 기기만다 다르기 때문에 위처럼 해야 한다.
        //path="/storage/emulated/0/";


        //3. 저장 버튼 클릭
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                check();
            }
        });

        //4. 불러 오기 버튼 클릭
        btnLoad.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                load();
            }
        });


        //5. 삭제 버튼 클릭
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File file =new File(path+"/test.txt");
//파일 .delete() 파일 삭제, 성공하면 true, 실패하면 false
                if(file.delete()){
                    edit1.setText("");
                    Toast.makeText(SdcardActivity.this, "삭제 되었습니다.",
                                            Toast.LENGTH_SHORT).show();
                }
            }
        });


    }

    void load(){
        try{
//스트림(바이트단위 입출력)
            FileInputStream is =
                    new FileInputStream(path+"/test.txt");
            if(is!=null){
//Reader, Writer : 문자 단위 입출력력
               InputStreamReader reader =new InputStreamReader(
                    is, "utf-8");
//버퍼를 사용한 입출력(빠른 처리 가능)

                BufferedReader br =new BufferedReader(reader);
                String str="";
                StringBuffer sb =new StringBuffer();
                while ((str=br.readLine())!=null){
                    sb.append(str+"\n");
                }
                is.close();
                edit1.setText(sb.toString());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    //사용권한 체크 (Minimum SDK vesrion 을 23 으로 설정 )
    void check(){
        //권한 검사(AndroidManifest.xml) , 사용자의  동의 여부
        if(checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED  ||
                checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED
           )
        {
            //권한 설정이 왜 필요한지 사용자에게 안내문 출력(선택적인 옵션)
            if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                Toast.makeText(this, "외부메모리에 읽기/쓰기 권한이 필요합니다.", Toast.LENGTH_LONG).show();
            }
            //팝업
            //requestPermissions("사용권한 배열", 요청코드)
            // 요청코드는 임의의 값 사용 가능
            requestPermissions(new String[]{
                   Manifest.permission.READ_EXTERNAL_STORAGE,
                   Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
        }else{
            // 동의한 상태 => save()
            save();
        }
        // 동의하지 않은 상태
        //팝업
    }

    //사용자의 사용권한 동의 여부가 전달
    //int requestCode - 요청코드
    //String[] permissions - 요청권한 배열
    //int[] grantResults - 권한 수락 여부 배열
    @Override
    public void onRequestPermissionsResult(int requestCode,
                  @NonNull String[] permissions, @NonNull int[] grantResults) {

            switch (requestCode){
                case 1: //요청코드
                     if(grantResults.length > 0 &&
                             grantResults[0]==PackageManager.PERMISSION_GRANTED &&
                             grantResults[1]==PackageManager.PERMISSION_GRANTED
                       ){
                        save();
                    }else{
                        Toast.makeText(this, "더이상 외부메모리를 사용할 수 없습니다.",
                                Toast.LENGTH_LONG).show();
                    }
            }
    }




    void save(){
        //외부메모리의 경로  내장 메모리 저장할 때의 코드작성과 같다. 차이는 path
        File file=new File(path+"/test.txt");
        try{
            FileOutputStream fos =new FileOutputStream(file);
            String str =edit1.getText().toString();
            fos.write(str.getBytes());
            fos.close();//스트림 닫기
            Toast.makeText(this, "저장되었습니다.", Toast.LENGTH_LONG).show();
        }catch (Exception e){
            e.printStackTrace();
        }
    }




}

 

 

 

read_write.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/read_write"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.choi.ex04_file.ReadWriteActivity">

    <Button
        android:text="저장"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/btnSave" />

    <Button
        android:text="불러오기"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/btnLoad" />

    <Button
        android:text="삭제"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:id="@+id/btnDelete" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/edit1"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_below="@+id/btnSave" />

</RelativeLayout>

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

음(陰)만으로서는 만물을 낳을 수가 없고 양(陽)만으로서도 될 수 없는 것이다. 음양이 함께 상응해야 되는 것이다. -잡편

댓글 ( 4)

댓글 남기기

작성