-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
미해결
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
소프트캠퍼스
지식공유자2020.10.23
외부 저장소 관련된 부분은 안드로이드 10 버전부터 변경되었습니다. 이 때문에 강좌에서 외부 저장소 관련된 코드는 9 버전까지만 동작합니다.
답변 1