SD 카드에 쓰기 권한


80

내 앱에서 애플리케이션 DB를 SD 카드에 보관하고 싶습니다. 내 코드에서 디렉토리 canWrite()가 있는지 확인 하고 그렇지 않은 경우 IOException. 이 특정 인스턴스에서 db 파일을 SD 카드의 루트 디렉토리에 복사하려고 시도했지만 IOException. 쓰기가 가능하도록 폴더 / 파일에 대한 권한을 어떻게 변경합니까?

답변:


209

SD 카드 디렉토리가 /sdcard맞지만 하드 코딩해서는 안됩니다. 대신를 호출 Environment.getExternalStorageDirectory()하여 디렉토리를 가져 오십시오.

File sdDir = Environment.getExternalStorageDirectory();

아직 그렇게하지 않았다면 매니페스트에 아래 줄을 추가하여 SD 카드에 쓸 수있는 올바른 권한을 앱에 부여해야합니다.

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

감사합니다 ... 귀하의 제안에 따라 코드를 변경하겠습니다. 그러나 현재 하드 코딩되어 있으며 매니페스트 파일에 권한이 설정되어 있지 않지만 어쨌든 SD 카드에 저장할 수 있습니다. 권한을 설정하지 않고 저장할 수있는 이유는 무엇입니까?
bugzy 2010

4
@ user244190-내 생각에는 휴대 전화가 Android 1.5를 실행 중일 것입니다. WRITE_EXTERNAL_STORAGE1.6에서 도입되었으므로 앞으로 호환되도록하려면 응용 프로그램에 포함해야합니다.
Dave Webb

@DaveWebb : 여기 내 질문을 참조하십시오 : stackoverflow.com/questions/9351904/…
Saher Ahwal

아무도 응답하지 않았고 왜 작동하지 않는지 모르겠습니다.
Saher Ahwal 2012

@DaveWebb-올바른 생각이지만, 아마도 전화가 1.5를 실행하고 있다는 것이 아니라 앱이 1.5에 대해 빌드되었다고 지정하거나 (더 일반적으로) 버전을 전혀 지정하지 않았으며 더 최근의 전화가 추가되는 것을 볼 때 이전 버전과의 호환성에 대한 권한.
Chris Stratton 2014 년

1

Dave의 답변에서 위의 제안 된 기술은 확실히 좋은 디자인 관행이며, 그렇습니다. 궁극적으로 필요한 권한은 외부 저장소에 액세스하기 위해 AndroidManifest.xml 파일에 설정되어야합니다.

그러나 대부분의 (모두는 아니지만 확실하지는 않지만) "매니페스트 옵션"을 추가하는 Mono-esque 방법은 활동 (또는 서비스)을 구현하는 클래스의 속성을 사용하는 것입니다.

Visual Studio Mono 플러그인은 매니페스트를 자동으로 생성하므로 수동으로 조작하지 않는 것이 가장 좋습니다 (다른 옵션이없는 경우가있을 수 있음).

예를 들면 :

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")]
public class MonoActivity : Activity
{
  protected override void OnCreate(Bundle bindle)
  {
    base.OnCreate(bindle);
  }
}

실제로이 WRITE_EXTERNAL_STORAGE 설정은 사용자 권한이며 위와 같이 설정하면 매니페스트 파일의 사용자 권한이 아닌 활동 설정 (android : permission)으로 표시됩니다. 아, 방금 기억했습니다. 사용자 권한 사용자를 VS의 프로젝트 속성 (모든 권한의 확인란 목록)으로 설정했습니다.
samis

1
실제로는 "user-permission"이 아니라 "uses-permission"태그이지만 그 외에는 모든 것이 적용됩니다.
samis

절대적으로 필요한 한 가지는 if (Build.VERSION.SDK_INT> = 19) {MainActivity.get (). getExternalFilesDirs (null); } // SD / Android / data / your.package.name에 액세스하려면 // 패키지 디렉토리를 직접 만들려고하지 마십시오. 이 호출을하지 않으면 mkdir 또는 mkdirs가 작동하지 않습니다.
pstorli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.