응용 프로그램 디렉토리 가져 오기


81

누군가 내 응용 프로그램 디렉토리의 경로를 얻는 방법을 알고 있습니까? (예를 들어 /data/data/my.app.lication/)

현재이 방법을 사용하고 있습니다. myActivity.getFilesDir().getParent();그러나 더 간단한 해결책이있을 때 해결 방법처럼 보입니다. 또한 부작용 files은 불필요한 디렉토리 생성입니다 .

설명 : 먼저-답장 해 주셔서 감사합니다. 다른 해결 방법이 아닌 이미 존재하는 방법이 있는지 이해하려고 노력합니다.


@MByD : 호기심 때문에 구체적으로 무엇을하려고하십니까? 해당 디렉토리가 필요하지 않습니다. 예를 들어, 데이터베이스 디렉토리로 작업하려면을 사용하십시오 getDatabasePath(). 또는 다른 것과 독립적으로 자신의 디렉토리를 원한다면 getDir().
CommonsWare 2011

@CommonsWare-내 패키지 폴더 아래에 여러 폴더를 생성하는 내 통제하에 있지 않은 공유 객체가 있으며 액세스해야합니다. 나는 왜 어떤 방법으로 기본 폴더를 사용할 수 없는지 궁금합니다.
MByD 2011

1
@MyByD : 공유 객체를 작성한 사람에게 머리 검사를 요청하십시오.
CommonsWare 2011

1
@ CommonsWare-그게 뭐가 그렇게 잘못 되었나요? 또한 부모님은 이유 때문에 저를 MByD라고 불렀습니다. 저를 MyByD라고 부르지 마세요;)
MByD

2
@MByD : 이름 오타에 대해 죄송합니다. 공유 객체와 관련하여 사용자가 해당 파일을 직접 조작 할 것으로 예상하는 경우 최소한 자체 솔루션을 해킹하는 대신 해당 디렉토리를 가져 오는 방법이나 무언가를 제공해야합니다. 반대로, 해당 파일을 직접 조작 할 것으로 예상 하지 않는 경우 코드를 통해 필요한 작업을 수행 할 수있는 API가 필요합니다. 수행하려는 작업이 공유 객체의 범위를 벗어난 경우 파일에 액세스하지 않아야합니다.
CommonsWare 2011

답변:


90
PackageManager m = getPackageManager();
String s = getPackageName();
PackageInfo p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;

eclipse가 잡히지 않은 것에 대해 걱정한다면 NameNotFoundException다음을 사용할 수 있습니다.

PackageManager m = getPackageManager();
String s = getPackageName();
try {
    PackageInfo p = m.getPackageInfo(s, 0);
    s = p.applicationInfo.dataDir;
} catch (PackageManager.NameNotFoundException e) {
    Log.w("yourtag", "Error Package name not found ", e);
}

3
내가 다른 솔루션을 사용하지만, 나는 당신이 정말 "깨끗한"발견
MByD

2
이것은 당신에게 APK 경로를 가져 sourceDir오며 불행히도 잘못된 이름입니다. dataDir당신이 찾고있는 것이어야합니다.
orip

2
질문이 요청한 응용 프로그램의 디렉토리를 반환합니다. 투표하기 전에 질문을 제대로 읽어보십시오.
Philip Sheard

나는이 구현을 시도했고 eclipse는 잡히지 않은 예외가 있다고 말했다 : Unhandled exception type PackageManager.NameNotFoundException
m-ric

아래의 간단한 한 라이너 인 내 대답을 참조하십시오.
James Wald


20

알 겠어

String appPath = App.getApp().getApplicationContext().getFilesDir().getAbsolutePath();

여기에서 :


2
getFilesDir는 dataDir의 하위 디렉터리를 반환합니다
njzk2 2013-08-22

9
답변하고있는 질문을 읽으십시오. getFilesDir () 메커니즘은 이미 제안되었으며 질문 자체에서 바람직하지 않은 것으로 거부되었습니다. 또한 njzk2에서 지적했듯이 질문에서 수행 한대로 부모 디렉터리를 가져 오지 않는 한 원하는 결과를 반환하지 않습니다.
Chris Stratton 2014 년

19

코드에서 이것을 사용하십시오.

 context.getApplicationInfo().dataDir

Android 5.1에서 훌륭하게 작동합니다. 감사합니다! 멋지고 간단합니다.
여호수아 핀터

이것은 부르는 것과 같 android.os.Environment.getDataDirectory().getAbsolutePath()습니까?
Pierre

10

현재 Android 애플리케이션 패키지의 경우 :

public String getDataDir(Context context) throws Exception {
    return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).applicationInfo.dataDir;
}

모든 패키지 :

public String getAnyDataDir(Context context, String packageName) throws Exception {
    return context.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.dataDir;
}

클래스가 패키지 내부에 있는지 여부를 찾을 수 있습니까?
Sunil Chaudhary

3

파일에 액세스하려는 경우 여기에 설명 된대로 openFileOutput()openFileInput()방법을 시도해보세요 . 내부 메모리의 지정된 파일에 대한 입력 / 출력 스트림을 자동으로 엽니 다. 이를 통해 디렉토리와 객체를 모두 우회 할 수 있으며 이는 매우 깨끗한 솔루션입니다.File


고마워요.하지만 실제로는 내 응용 프로그램 디렉토리 경로를 반환하는 함수가 있는지 이해하려고 노력하고 있습니다. 많이 사용하고 있으며 현재 솔루션은 나에게 매우 못 생겼습니다.
MByD

@MByd, 아. 당신이 찾고 있던 것이 아니 어서 죄송합니다!
Chris Thompson

@MByD : "많이 사용하고 있습니다"라는 말은 무슨 뜻입니까? 당신은 코드의 많은 곳에서 그것을합니까 ???
Squonk 2011

@MisterSquank-네. util 클래스로 이동할 것 같지만 여전히 ...
MByD

getFilesDir () 접근 방식과 마찬가지로 이것은 원하는 경로에 액세스하지 않고 그 안의 하위 디렉토리에 액세스합니다.
Chris Stratton 2014 년

3

@ jared-burrows의 솔루션을 기반으로합니다. 모든 패키지에 대해 컨텍스트를 매개 변수로 전달 중 ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.