एप्लिकेशन निर्देशिका प्राप्त करें


81

क्या कोई जानता है कि मुझे अपने आवेदन निर्देशिका का मार्ग कैसे मिलेगा? (उदा /data/data/my.app.lication/)

वर्तमान में मैं इस पद्धति का उपयोग कर रहा हूं: myActivity.getFilesDir().getParent();लेकिन यह मेरे लिए एक सरल समाधान की तरह वर्कअराउंड की तरह प्रतीत होता है। साथ ही, साइड-इफेक्ट filesडायरेक्टरी का निर्माण है , जिसकी जरूरत नहीं है।

स्पष्टीकरण: पहले - उत्तरदाताओं के लिए धन्यवाद। मैं समझने की कोशिश करता हूं कि क्या पहले से मौजूद पद्धति है जो इसे करती है, दूसरे काम के लिए नहीं।


@MByD: जिज्ञासा से बाहर, विशेष रूप से आप क्या करने की कोशिश कर रहे हैं? आपको उस निर्देशिका की कोई आवश्यकता नहीं होनी चाहिए। उदाहरण के लिए, यदि आप डेटाबेस निर्देशिका के साथ काम करना चाहते हैं, तो उपयोग करें getDatabasePath()। या, यदि आप अपनी खुद की निर्देशिका किसी और चीज से स्वतंत्र चाहते हैं, तो उपयोग करें getDir()
कॉमन्सवेयर

@CommonsWare - मेरे पास एक साझा ऑब्जेक्ट है जो मेरे नियंत्रण में नहीं है जो मेरे पैकेज फ़ोल्डर के तहत कई फ़ोल्डर्स बनाता है, और मुझे उन्हें एक्सेस करने की आवश्यकता है। मुझे आश्चर्य है कि बेस फोल्डर किसी विधि द्वारा क्यों उपलब्ध नहीं है।
एमबीडी

1
@MyByD: बताएं कि जिसने भी उस वस्तु को उनके सिर की जांच करने के लिए साझा किया है।
कॉमन्सवेयर 12

1
@CommonsWare - उसके बारे में क्या गलत है? इसके अलावा, मेरे माता-पिता ने मुझे एक कारण के लिए MByD कहा, कृपया मुझे MyByD मत कहो;)
MByD

2
@MByD: नाम टाइपो के बारे में क्षमा करें। साझा किए गए ऑब्जेक्ट के संबंध में, यदि वे आपसे उन फ़ाइलों को सीधे हेरफेर करने की अपेक्षा कर रहे हैं, तो कम से कम आपको वे स्वयं निर्देशिकाओं को प्राप्त करने के लिए उन निर्देशिकाओं को प्राप्त करने के लिए तरीके या कुछ देने की आवश्यकता है। इसके विपरीत, यदि वे आपसे सीधे उन फ़ाइलों में हेरफेर करने की उम्मीद नहीं कर रहे हैं, तो उन्हें कुछ एपीआई की आवश्यकता होती है ताकि आप अपने कोड के माध्यम से क्या कर सकें। यदि आप जो करने की कोशिश कर रहे हैं वह साझा किए गए ऑब्जेक्ट के दायरे से बाहर है, तो शायद आपको फ़ाइलों तक पहुंचने की कोशिश नहीं करनी चाहिए।
कॉमन्सवेयर

जवाबों:


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

यदि ग्रहण एक अनिश्चय की चिंता करता है 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
यह आपको sourceDirएपीके पथ प्राप्त करता है, एक दुर्भाग्यपूर्ण शरारत है। dataDirवह होना चाहिए जिसकी आपको तलाश है।
१/२

2
यह एप्लिकेशन की निर्देशिका को लौटाता है, जो कि प्रश्न के लिए पूछा गया है। लोगों को वोट देने से पहले प्रश्न को ठीक से पढ़ने का प्रयास करें।
फिलिप शीयर

मैंने इसे लागू करने की कोशिश की और ग्रहण ने मुझे बताया कि एक अनकहा अपवाद है: अखंडित अपवाद प्रकार PackageManager.NameNotFoundException
m-ric

नीचे मेरा जवाब देखें जो एक साधारण एक लाइनर है।
जेम्स वाल्ड


20

मुझे यह मिल गया

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

यहाँ से :


2
getFilesDir डाटाडिर का उप
njzk2

9
आप जिस प्रश्न का उत्तर दे रहे हैं, उसे पढ़ने के लिए कृपया समय निकालें। GetFilesDir () तंत्र पहले से ही प्रस्तावित था और प्रश्न के पाठ में अवांछनीय के रूप में खारिज कर दिया गया था। इसके अतिरिक्त, जैसा कि njzk2 द्वारा बताया गया है कि यह वांछित परिणाम नहीं देता है जब तक कि आप इसके मूल निर्देशिका को नहीं लेते हैं, जैसा कि प्रश्न में किया गया है।
क्रिस स्ट्रैटन

19

बस इसे अपने कोड में उपयोग करें

 context.getApplicationInfo().dataDir

एंड्रॉइड 5.1 पर महान काम करता है, धन्यवाद! अच्छा और सरल।
जोशुआ पिंटर

क्या यह कॉलिंग जैसा ही है 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;
}

क्या मुझे पता चल सकता है कि एक पैकेज के अंदर एक वर्ग है या नहीं?
सुनील चौधरी

3

यदि आप किसी फ़ाइल तक पहुँचने की कोशिश कर रहे हैं, तो यहाँ बताए गए तरीकों openFileOutput()और openFileInput()तरीकों को आज़माएँ । वे स्वचालित रूप से आंतरिक मेमोरी में निर्दिष्ट फ़ाइल में इनपुट / आउटपुट स्ट्रीम खोलते हैं। यह आपको निर्देशिका और वस्तुओं को पूरी तरह से बायपास करने की अनुमति देता है जो कि एक सुंदर स्वच्छ समाधान है।File


धन्यवाद, लेकिन वास्तव में मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि क्या कोई ऐसा फ़ंक्शन है जो मेरे एप्लिकेशन को डीआईआर का रास्ता देता है, मैं इसे बहुत उपयोग कर रहा हूं और मेरा वर्तमान समाधान मुझे बहुत बदसूरत लग रहा है।
एमबीडी

@MByd, आह। मुझे होश आ गया, क्षमा करें यह वह नहीं था जिसकी आपको तलाश थी!
क्रिस थॉम्पसन

@MByD: जब आप कहते हैं "मैं इसे बहुत उपयोग कर रहा हूं", तो आपका क्या मतलब है? आप इसे अपने कोड में बहुत सी जगहों पर करते हैं ???
स्क्वॉन्क

@MisterSquank - हाँ। ऐसा लगता है कि यह कक्षा का उपयोग करने के लिए आगे बढ़ने जा रहा है, लेकिन फिर भी ...
एमबी

GetFilesDir () दृष्टिकोण के साथ, यह वांछित पथ तक नहीं पहुंचेगा, बल्कि इसके भीतर एक उपनिर्देशिका होगी।
क्रिस स्ट्रैटन

3

@ Jared-burrows समाधान के आधार पर। किसी भी पैकेज के लिए, लेकिन पैरामीटर के रूप में संदर्भ पारित ...

public static String getDataDir(Context context) throws Exception {
    return context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0)
            .applicationInfo.dataDir;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.