developer tip

Android에서 파일 생성 시도 : 열기 실패 : EROFS (읽기 전용 파일 시스템)

optionbox 2021. 1. 11. 08:04
반응형

Android에서 파일 생성 시도 : 열기 실패 : EROFS (읽기 전용 파일 시스템)


이 줄 :

final FileOutputStream outputStream = new FileOutputStream(name);

"2ozjfFQzwv"가 파일 이름으로 전달 된 FileNotFoundException메시지와 함께 결과가 나타 /2ozjfFQzwv: open failed: EROFS (Read-only file system)납니다.

나는 WRITE_INTERNAL_STORAGE허락 없이 이것을 시도했다 . 이 파일을 작성하려면 어떻게 만드나요?

또는 새 활동에 이미지를 제공 할 수 있기를 원하며 추가로 직렬화하기에는 너무 큽니다. 파일에 기록한 다음 다시 읽는 것보다 쉬운 방법이 있습니까? 여기에있는 모든 질문은 SD 카드에 쓰기에 관한 것 같습니다. 많은 사람들이 SD 카드 슬롯을 가지고 있지 않기 때문에 저는하고 싶지 않습니다.


WRITE_INTERNAL_STORAGE 권한 유무에 관계없이 이것을 시도했습니다.

WRITE_INTERNAL_STORAGEAndroid 에는 권한 이 없습니다 .

이 파일을 작성하려면 어떻게 만드나요?

앱이 수퍼 유저 권한으로 실행되는 경우 루팅 된 기기를 제외하고는 그렇지 않습니다. 앱이 액세스 할 수없는 내부 저장소의 루트에 쓰려고합니다.

객체 FileOutputStream를 취하는 생성자 의 버전을 사용하십시오 File. 다음 File과 같이 쓸 수있는 위치를 기반으로 해당 개체를 만듭니다 .

  • getFilesDir()(귀하 Activity또는 다른 사람 에게 전화 함 Context)
  • getExternalFilesDir()(귀하 Activity또는 다른 사람 에게 전화 함 Context)

후자는 WRITE_EXTERNAL_STORAGE허가로 필요합니다 .

파일에 기록한 다음 다시 읽는 것보다 쉬운 방법이 있습니까?

정적 데이터 멤버에 임시로 넣을 수 있습니다.

많은 사람들이 SD 카드 슬롯이 없기 때문에

"SD 카드 슬롯"은 대체로 무관합니다. Android 기기 사용자의 99 %는 외부 저장소를 갖게됩니다. 단, 사용자가 SD 카드를 제거한 4 년 이상 된 기기는 예외입니다. 2010 년 중반 이후에 제조 된 장치에는 이동식 미디어가 아닌 온보드 플래시의 일부로 외부 저장소가 있습니다.


WRITE_EXTERNAL_STORAGE의 권한을 사용해보십시오. 외부 카드 유무에 관계없이 사용해야합니다.

이것은 나를 위해 잘 작동합니다.

path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);

내 파일을 적절한 폴더에 저장합니다.


첨가

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

매니페스트에서 Martin과 동일하게 사용 :

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname);

효과가있었습니다.


다음은 Android 개발자의 간단한 샘플 입니다 .

기본적으로 다음과 같이 내부 저장소에 파일을 쓸 수 있습니다.

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

다른 사람들이 언급했듯이 Android의 앱은 내부 저장소가 아닌 자신의 개인 저장소 (/ data / data / PACKAGE_NAME 아래)에 파일을 쓸 수 없습니다.

API를 사용하여 앱에 허용되는 올바른 경로를 가져와야합니다.

이것을 읽으십시오 .


Google은 외부 sdcard에 대한 쓰기 액세스를 제한했습니다. API 19에는 쓰기 액세스를 허용하는 "계약"을 설정할 수있는 스토리지 액세스 프레임 워크라는 프레임 워크가 있습니다.

추가 정보 :

Android-새 저장소 액세스 프레임 워크를 사용하여 파일을 외부 SD 카드에 복사하는 방법


단위 / 계측 테스트에서 이것을 얻는 사람이 있다면 getFilesDir()테스트 컨텍스트가 아닌 앱 컨텍스트에서 호출해야합니다 . 즉 사용 :

Context appContext = getInstrumentation().getTargetContext().getApplicationContext();

아니

Context appContext = InstrumentationRegistry.getContext;

애플리케이션에 내부 저장소를 사용하려면 권한이 필요하지 않지만 File directory = getApplication().getCacheDir();앱에 허용 된 디렉터리를 가져 오려면 다음 을 사용해야 할 수 있습니다.

또는 :
getCashDir();<-작동해야 함
context.getCashDir();(브로드 캐스트 수신기에있는 경우)
getDataDir();<-Api 24

ReferenceURL : https://stackoverflow.com/questions/15711098/trying-to-create-a-file-in-android-open-failed-erofs-read-only-file-system

반응형