Nhận thư mục ứng dụng


81

Có ai đó biết cách tôi lấy đường dẫn của thư mục ứng dụng của tôi không? (vd /data/data/my.app.lication/)

Hiện tại tôi đang sử dụng phương pháp này: myActivity.getFilesDir().getParent();nhưng đối với tôi nó giống như một giải pháp thay thế khi có một giải pháp đơn giản hơn. Ngoài ra, tác dụng phụ là việc tạo filesthư mục, không cần thiết.

Làm rõ: Đầu tiên - Cảm ơn vì các đại diện. Tôi cố gắng tìm hiểu xem liệu đã tồn tại một phương pháp thực hiện nó, không phải cho một công việc khác.


@MByD: Vì tò mò, cụ thể là bạn đang cố gắng làm gì? Bạn không cần cho thư mục đó. Ví dụ, nếu bạn muốn làm việc với thư mục cơ sở dữ liệu, hãy sử dụng getDatabasePath(). Hoặc, nếu bạn muốn thư mục của riêng mình độc lập với bất kỳ thứ gì khác, hãy sử dụng getDir().
CommonsWare

@CommonsWare - Tôi có một đối tượng được chia sẻ không thuộc quyền kiểm soát của tôi, nó tạo ra một số thư mục trong thư mục gói của tôi và tôi cần truy cập chúng. Tôi chỉ tự hỏi tại sao thư mục cơ sở không có sẵn bằng một số phương pháp.
MByD

1
@MyByD: Bảo ai đã viết bài chia sẻ đó đi kiểm tra đầu.
CommonsWare

1
@CommonsWare - Điều đó có gì sai? Ngoài ra, bố mẹ tôi gọi tôi là MByD là có lý do, vui lòng không gọi tôi là MyByD;)
MByD

2
@MByD: Xin lỗi về lỗi đánh máy tên. Đối với đối tượng được chia sẻ, nếu họ muốn bạn thao tác trực tiếp các tệp đó, thì tối thiểu họ cần cung cấp cho bạn các phương pháp hoặc thứ gì đó để lấy các thư mục đó, thay vì bạn phải hack giải pháp của riêng mình. Ngược lại, nếu họ không mong đợi bạn thao tác trực tiếp các tệp đó, thì họ cần một số API để cho phép bạn thực hiện những gì cần làm thông qua mã của họ. Nếu những gì bạn đang cố gắng thực hiện nằm ngoài phạm vi của đối tượng được chia sẻ, thì có lẽ bạn không nên cố gắng truy cập các tệp.
CommonsWare

Câu trả lời:


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

Nếu eclipse lo lắng về một sự không thành công NameNotFoundException, bạn có thể sử dụng:

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
mặc dù tôi sử dụng giải pháp khác nhau, tôi thấy bạn thực sự "sạch"
MByD

2
Điều này giúp bạn có được đường dẫn APK, đây sourceDirlà một sự nhầm lẫn đáng tiếc. dataDirphải là những gì bạn đang tìm kiếm.
orip

2
Nó trả về thư mục của ứng dụng, đó là những gì mà câu hỏi yêu cầu. Hãy thử đọc đúng câu hỏi trước khi bạn bỏ phiếu cho mọi người.
Philip Sheard

Tôi đã cố gắng thực hiện điều này và nhật thực nói với tôi có một ngoại lệ còn tự do: Unhandled loại ngoại lệ PackageManager.NameNotFoundException
m-ric

Xem câu trả lời của tôi dưới đây là một lớp lót đơn giản.
James Wald


20

tôi hiểu rồi

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

từ đây :


2
getFilesDir trả về một subdir của datadir
njzk2

9
Vui lòng dành thời gian đọc câu hỏi bạn đang trả lời. Cơ chế getFilesDir () đã được đề xuất và bị từ chối do không mong muốn trong chính nội dung câu hỏi. Ngoài ra, như được chỉ ra bởi njzk2, nó không trả về kết quả mong muốn trừ khi bạn lấy thư mục mẹ của nó, như đã thực hiện trong câu hỏi.
Chris Stratton

19

Chỉ cần sử dụng điều này trong mã của bạn

 context.getApplicationInfo().dataDir

Hoạt động tốt trên Android 5.1, cảm ơn! Đẹp và đơn giản.
Joshua Pinter,

Điều này có giống với cách gọi android.os.Environment.getDataDirectory().getAbsolutePath()không?
Pierre

10

Đối với gói ứng dụng Android hiện tại:

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

Đối với bất kỳ gói nào:

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

tôi có thể tìm thấy rằng một lớp nằm trong một gói hay không?
Sunil Chaudhary

3

Nếu bạn đang cố gắng truy cập vào một tệp, hãy thử các phương pháp openFileOutput()openFileInput()như được mô tả ở đây . Chúng tự động mở các luồng đầu vào / đầu ra tới tệp được chỉ định trong bộ nhớ trong. Điều này cho phép bạn bỏ qua Filehoàn toàn thư mục và các đối tượng, đây là một giải pháp khá rõ ràng.


Cảm ơn, nhưng thực ra tôi chỉ đang cố gắng hiểu xem có một chức năng nào trả về đường dẫn dir ứng dụng của tôi hay không, tôi đang sử dụng nó rất nhiều và giải pháp hiện tại của tôi trông khá xấu đối với tôi.
MByD

@MByd, à. Tôi hiểu rồi, xin lỗi, đó không phải là thứ bạn đang tìm kiếm!
Chris Thompson

@MByD: Khi bạn nói "Tôi đang sử dụng nó rất nhiều", ý bạn là gì? Bạn làm điều đó ở rất nhiều nơi trong mã của bạn ???
Squonk

@MisterSquank - Có. Nó có vẻ như nó sẽ chuyển sang util lớp, nhưng vẫn ...
MByD

Như với các phương pháp getFilesDir (), điều này sẽ không truy cập vào đường dẫn mong muốn mà là một thư mục con bên trong nó.
Chris Stratton

3

Dựa trên giải pháp của @ jared-burrows. Đối với bất kỳ gói nào, nhưng truyền Context dưới dạng tham số ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.