2010-06-17 10 views
6

मैं एक एंड्रॉइड 2.2 ऐप लिखने की कोशिश कर रहा हूं जो इंस्टॉल किए गए ऐप्स ढूंढ पाएगा जिन्हें एसडी कार्ड में ले जाया जा सकता है। ऐसा करने की अनुमति AndroidManifest.xml फ़ाइल में रूट-स्तर विशेषता "android:installLocation" के रूप में एन्कोड की गई है। PackageInfo में यह विशेषता है लेकिन यह विशेषता सब कुछ के लिए एक इंटरफ़ेस है। मैं स्थापित एपीके खोल सकता हूं और एंड्रॉइडमैनीफेस्ट.एक्सएमएल फ़ाइल निकाल सकता हूं, लेकिन ऐसा लगता है कि कुछ बाइनरी एन्कोडिंग प्रारूप में कुछ यादृच्छिक इंटरनेट लोगों ने एक डिकोडर लिखा है, लेकिन यह बहुत काम की तरह लगता है।एंड्रॉइड एक्सेस करना: installLocation manifest विशेषता

क्या कोई इंटरफ़ेस है जो मुझे याद नहीं है?

उत्तर

12

जैसा कि यह पता चला है, installLocation प्राप्त करने के लिए कोई सीधी एपीआई कॉल नहीं है, न ही मुझे बाइनरी एक्सएमएल मैन्युअल रूप से पार्स करना है, क्योंकि प्रदत्त XmlResourceParser उस पर काम करता है।

// Experimentally determined 
private static final int auto = 0; 
private static final int internalOnly = 1; 
private static final int preferExternal = 2; 

AssetManager am = createPackageContext(packageName, 0).getAssets(); 
XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); 
int eventType = xml.getEventType(); 
xmlloop: 
while (eventType != XmlPullParser.END_DOCUMENT) { 
    switch (eventType) { 
     case XmlPullParser.START_TAG: 
      if (! xml.getName().matches("manifest")) { 
       break xmlloop; 
      } else { 
       attrloop: 
       for (int j = 0; j < xml.getAttributeCount(); j++) { 
        if (xml.getAttributeName(j).matches("installLocation")) { 
         switch (Integer.parseInt(xml.getAttributeValue(j))) { 
          case auto: 
           // Do stuff 
           break; 
          case internalOnly: 
           // Do stuff 
           break; 
          case preferExternal: 
           // Do stuff 
           break; 
          default: 
           // Shouldn't happen 
           // Do stuff 
           break; 
         } 
         break attrloop; 
        } 
       } 
      } 
      break; 
     } 
     eventType = xml.nextToken(); 
    } 

उह, मैं वहाँ वहाँ में एक switch एक case साथ कि शायद सिर्फ एक if होना चाहिए लगता है। ओह अच्छा। तुम समझ गए।

+0

अपेक्षाकृत आसान लगता है - जानना अच्छा है! – Joubarc

0

मैनिफेस्ट टैग के सभी अन्य प्रत्यक्ष विशेषताओं को ध्यान में रखते हुए पैकेजइन्फो से उपलब्ध हैं, मुझे लगता है कि आप इसे देखने का अधिकार रखते हैं।

मुझे पता है कि यह दस्तावेज़ में नहीं है, लेकिन क्या आपने वैसे भी प्रयास किया? (मंद होने के कारण इस समय एपीआई 7 पर अटक और मैं यह सुझाव है, तो मैं इसे अपने आप कोशिश कर सकते हिम्मत नहीं कर सकता - तरह

PackageInfo pkg = ...; 
String loc = pkg.installLocation(); 

कुछ मैं जानता हूँ कि यह शायद बहुत भोली डॉक पर विचार भी स्वचालित रूप से उत्पन्न किया जा सकता है ओएस 8 में अब समर्थित नहीं है)

यदि यह काम नहीं करता है, तो मुझे डर है कि उन्होंने इसे अनदेखा किया - मुझे कल्पना नहीं है कि वे इसे अचानक कहीं और रखेंगे। उस स्थिति में, आप शायद अपने आप से वास्तव में प्रकट होकर फंस जाएंगे।

+0

मुझे लगता है कि कोशिश किया मौजूद है, और यह काम नहीं किया। – wfaulk

+0

हाँ, मेरे हिस्से पर बहुत अधिक इच्छापूर्ण सोच मुझे लगता है। – Joubarc

0

2007 से पुराने एपीआई में, पैकेजइन्फो क्लास में सार्वजनिक क्षेत्र थे जो आंतरिक स्थान और अन्य प्रासंगिक जानकारी पर सभी जानकारी देते थे। सुरक्षा कारणों से मुझे लगता है कि वे उन सुविधाजनक क्षेत्रों से छुटकारा पा चुके हैं।

0

आप अगले उदाहरण के द्वारा इस विशेषता का उपयोग हो सकता है:

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(mPackageName, 0); 
if (packageInfo.installLocation != PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) { 
    ..... 
} 

http://developer.android.com/reference/android/content/pm/PackageInfo.html#installLocation
एपीआई 21

में पेश किया गया था लेकिन इस क्षेत्र को भी Android 2.3 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/content/pm/PackageInfo.java/ में

संबंधित मुद्दे