• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

android 상위 버전에서는 작동이 안됩니다!

20.10.22 14:38 작성 조회수 189

0

API 25일 경우는 강의와 같이 잘 작동이 되는데, API 29로 작동 할 경우, 작동이 되질 않습니다!

왜 그런지 알 수 있을까요?

항상 양질의 강의 감사합니다!

package org.techdown.fileinputoutput;

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

// 안드로이드는 외부 저장소와 내부 저장소를 제공하고 있다
// 외부 저장소 및 내부 저장소 모두 파일 입출력이 가능하다

public class MainActivity extends AppCompatActivity {
    TextView text1;
    // 확인 받을 권한 목록(외부 저장소)
    String[] permission_list = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    // 외부 저장소까지의 경로를 담을 변수
    String path;

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

        text1 = (TextView)findViewById(R.id.textView);

        // 권한 확인 받는 메서드를 호출한다
        checkPermission();

        // 저장할 외부 저장소의 경로를 구한다
        File f1 = Environment.getExternalStorageDirectory();
        String a1 = f1.getAbsolutePath();

        // 패키지명을 구한다
        String a2 = getPackageName();

        // 이 영역에 패키지명과 동일하게 저장하면 어플 삭제시 삭제됨
        // 이외의 영역에 저장할 경우 어플이 삭제되도 유지
        path = a1 + "/android/data/" + a2;
    }

    public void btnMethod(View view){
        try {
            // 내부 저장소에 데이터를 쓸 경우
            // 내부 저장소와 연결 되어 있는 쓰기 스트림 추출
            // MODE_PRIVATE 이전 내용을 덮어쓰기, MODE_APPEND 이전 내용에 추가하기
            FileOutputStream fos = openFileOutput("myFile.dat", MODE_PRIVATE);
            DataOutputStream dos = new DataOutputStream(fos);

            // 데이터를 쓴다
            dos.writeInt(100);
            dos.writeDouble(11.11);
            dos.writeBoolean(true);
            dos.writeUTF("문자열");

            // 파일을 닫는다
            dos.flush();
            dos.close();

            text1.setText("내부 저장소 쓰기 완료");

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void btnMethod2(View view){
        try {
            FileInputStream fis = openFileInput("myFile.dat");
            DataInputStream dis = new DataInputStream(fis);

            // 파일에 출력한 순서대로 입력받는다.

            int data1 = dis.readInt();
            double data2 = dis.readDouble();
            boolean data3 = dis.readBoolean();
            String data4= dis.readUTF();

            text1.setText("data1 : " + data1 + "\n");
            text1.append("data2 : " + data2 + "\n");
            text1.append("data3 : " + data3 + "\n");
            text1.append("data4 : " + data4 + "\n");


        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public void btnMethod3(View view){
        try {
            checkExternalDirectory();

            FileOutputStream fos = new FileOutputStream(path + "/sd_file.dat");
            DataOutputStream dos = new DataOutputStream(fos);

            dos.writeInt(10);
            dos.writeDouble(11.11);
            dos.writeBoolean(true);
            dos.writeUTF("문자열");

            dos.flush();
            dos.close();

            text1.setText("ㅁㄴㅇㅁㄴㅇ");

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void btnMethod4(View view){
        try {
            FileInputStream fis = new FileInputStream(path + "/sd_file.dat");
            DataInputStream dis = new DataInputStream(fis);

            int data1 = dis.readInt();
            double data2= dis.readDouble();
            boolean data3 = dis.readBoolean();
            String data4 = dis.readUTF();

            dis.close();

            text1.setText("data1 : " + data1 + "\n");
            text1.append("data2 : " + data2 + "\n");
            text1.append("data3 : " + data3 + "\n");
            text1.append("data4 : " + data4 + "\n");

        }catch (Exception e){
            e.printStackTrace();
        }
    }



    public void checkPermission(){
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
            return;
        }

        for(String permission : permission_list){
            int chk = checkCallingOrSelfPermission(permission);
            if(chk == PackageManager.PERMISSION_DENIED){
                requestPermissions(permission_list, 0);
                break;
            }
        }
    }

    public void checkExternalDirectory(){
        // 외부저장소 경로가 있는지 확인하고 없으면 생성한다
        File file = new File(path);

        if(file.exists() == false){
            file.mkdir();
        }
    }
}

답변 1

답변을 작성해보세요.

1

외부 저장소 관련된 부분은 안드로이드 10 버전부터 변경되었습니다. 이 때문에 강좌에서 외부 저장소 관련된 코드는 9 버전까지만 동작합니다.