アプリケーションディレクトリを取得する


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 2011

2
これによりAPKパスが取得されますが、これはsourceDir残念な名前の誤りです。dataDirあなたが探しているものでなければなりません。
orip 2011年

2
それは、質問が求めたものであるアプリケーションのディレクトリを返します。反対票を投じる前に、質問を正しく読んでみてください。
フィリップシェアード2012

私はこの実装を試しましたが、eclipseは、キャッチされない例外があることを教えてくれました:未処理の例外タイプPackageManager.NameNotFoundException
m-ric 2012

以下の私の答えを参照してください。これは単純なワンライナーです。
James Wald 2014年


20

私はこれを得た

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

ここから


2
getFilesDirは、dataDirのサブディレクトリを返します
njzk2

9
あなたが答えている質問を読むのに時間をかけてください。getFilesDir()メカニズムはすでに提案されており、質問自体のテキストでは望ましくないものとして拒否されています。さらに、njzk2で指摘されているように、質問で行ったように、親ディレクトリを取得しない限り、目的の結果は返されません。
クリス・ストラットン2014年

19

これをコードで使用するだけです

 context.getApplicationInfo().dataDir

Android 5.1でうまく機能します、ありがとう!素晴らしくてシンプル。
Joshua Pinter 2017年

これは呼び出すことと同じandroid.os.Environment.getDataDirectory().getAbsolutePath()ですか?
ピエール

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;
}

クラスがパッケージ内にあるかどうかを確認できますか?
SunilChaudhary20年

3

ファイルにアクセスしようとしている場合はopenFileOutput()ここでopenFileInput()説明されている方法とメソッドを試してください。内部メモリ内の指定されたファイルへの入力/出力ストリームを自動的に開きます。これにより、ディレクトリとFileオブジェクトを完全にバイパスできます。これは非常にクリーンなソリューションです。


ありがとう、しかし実際には、アプリケーションのディレクトリパスを返す関数があるかどうかを理解しようとしています。私はそれを頻繁に使用しており、現在のソリューションはかなり醜いように見えます。
MByD 2011

@ MByd、ああ。申し訳ありませんが、お探しのものではありませんでした。
クリス・トンプソン

@MByD:「私はそれをたくさん使っている」と言うとき、どういう意味ですか?あなたはあなたのコードの多くの場所でそれをしますか?
スクォンク2011

@ MisterSquank-はい。utilクラスに移行するようですが、それでも...
MByD 2011

getFilesDir()アプローチと同様に、これは目的のパスにアクセスするのではなく、その中のサブディレクトリにアクセスします。
クリス・ストラットン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.