2010-06-17 31 views
6

Tôi đang cố viết ứng dụng Android 2.2 sẽ tìm ứng dụng đã cài đặt có thể được chuyển sang thẻ SD. Việc cho phép thực hiện việc này được mã hóa trong tệp AndroidManifest.xml làm thuộc tính cấp gốc "android:installLocation". PackageInfo dường như có giao diện với mọi thứ nhưng thuộc tính này. Tôi có thể mở gói ứng dụng đã cài đặt và giải nén tệp AndroidManifest.xml, nhưng có vẻ như ở định dạng mã hóa nhị phân, một số người internet ngẫu nhiên đã viết bộ giải mã, nhưng điều đó có vẻ giống như một công việc khủng khiếp.Truy cập thuộc tính android: installLocation manifest

Có giao diện nào bị thiếu không?

Trả lời

12

Khi nó quay ra, trong khi không có lệnh gọi API trực tiếp nào để nhận installLocation, tôi cũng không phải phân tích cú pháp XML nhị phân theo cách thủ công, như được cung cấp trên 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(); 
    } 

Uh, tôi đoán có một switch trong đó với một case rằng nên có lẽ chỉ là một if. Oh well. Bạn sẽ có được điểm.

+0

Có vẻ tương đối dễ đủ - rất tốt để biết! – Joubarc

0

Xem xét tất cả các thuộc tính trực tiếp khác của thẻ kê khai có sẵn từ PackageInfo, tôi nghĩ bạn có quyền tìm kiếm ở đó.

Tôi biết nó không có trong tài liệu, nhưng bạn đã thử chưa? Một cái gì đó như

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

Tôi biết điều này có lẽ là rất ngây thơ xem xét doc thậm chí có thể được tạo ra tự động - và tôi sẽ không dám đề nghị nó nếu tôi có thể thử bản thân mình (bị mắc kẹt trên API 7 vào lúc này do chậm phát triển Hệ điều hành không được hỗ trợ nữa trong 8)

Nếu nó không hoạt động, tôi sợ rằng họ chỉ bỏ qua điều đó - tôi không thể tưởng tượng được rằng họ sẽ đột ngột đặt nó ở đâu đó. Trong trường hợp đó, có thể bạn sẽ tự mình bị phân tích cú pháp phân tích các tệp kê khai.

+0

tôi đã cố gắng đó, và nó không hoạt động. – wfaulk

+0

Vâng, quá nhiều suy nghĩ mơ hồ về phần tôi, tôi cho là vậy. – Joubarc

0

Trong API cũ hơn từ năm 2007, có các trường công khai trong lớp PackageInfo cung cấp tất cả thông tin trên InternalLocation và các thông tin liên quan khác. Vì lý do bảo mật, tôi đoán họ đã loại bỏ những trường thuận lợi đó.

0

Bạn có thể truy cập vào thuộc tính này bằng ví dụ tiếp theo:

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
đã được giới thiệu trong API 21

Nhưng lĩnh vực này tồn tại ngay cả trong Android 2,3 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/content/pm/PackageInfo.java/

Các vấn đề liên quan