2012-03-24 15 views
10

Tylko dokumentacja (http://developer.android.com/guide/topics/manifest/manifest-element.html#uid) stwierdza, że ​​nie mogę używać nieprzetworzonych łańcuchów i poziomu interfejsu API, który został dodany, ale nie wyjaśnia, dlaczego chciałbym go użyć. Jeśli już ustawiłem android: sharedUserID na "com.foo.bar", jaką wartość powinienem umieścić w łańcuchu, do którego odwołuje się android: sharedUserLabel, a co najważniejsze dlaczego !?Co to jest Android: sharedUserLabel i jaką wartość dodaną dodaje na system Android: sharedUserID?

Dziękuję

Odpowiedz

7

O ile mi zrozumieć z AOSP rzeczywiście można użyć tej etykiety tylko do wyświetlania ładną nazwę użytkownika (jeśli masz kilka procesów w tym samym uid). Na przykład tutaj jest część kodu w pliku RunningState.java:

// If we couldn't get information about the overall 
    // process, try to find something about the uid. 
    String[] pkgs = pm.getPackagesForUid(mUid); 

    // If there is one package with this uid, that is what we want. 
    if (pkgs.length == 1) { 
     try { 
      ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0); 
      mDisplayLabel = ai.loadLabel(pm); 
      mLabel = mDisplayLabel.toString(); 
      mPackageInfo = ai; 
      return; 
     } catch (PackageManager.NameNotFoundException e) { 
     } 
    } 

    // If there are multiple, see if one gives us the official name 
    // for this uid. 
    for (String name : pkgs) { 
     try { 
      PackageInfo pi = pm.getPackageInfo(name, 0); 
      if (pi.sharedUserLabel != 0) { 
       CharSequence nm = pm.getText(name, 
         pi.sharedUserLabel, pi.applicationInfo); 
       if (nm != null) { 
        mDisplayLabel = nm; 
        mLabel = nm.toString(); 
        mPackageInfo = pi.applicationInfo; 
        return; 
       } 
      } 
     } catch (PackageManager.NameNotFoundException e) { 
     } 
    } 

Zasadniczo robi następujące rzeczy. Najpierw próbuje uzyskać informacje o całym procesie. Jeśli nie znajdzie, próbuje uzyskać informacje za pomocą UID aplikacji jako parametru (jest to część kodu, który tutaj podałem). Jeśli jest tylko jeden pakiet z tym UID, informacje o procesie są pobierane z tego pakietu. Ale jeśli istnieje kilka pakietów (przy użyciu shareUserId), to iteruje i próbuje znaleźć oficjalną (śliczną) nazwę.

Jako potwierdzenie moich słów znalazłem następujący ciąg w MediaProvider:

<!-- Label to show to user for all apps using this UID. --> 
<string name="uid_label">Media</string> 

Zatem wszystkie zużywając android:sharedUserId="android.media" będzie mieć nazwę Media.

Nie sądzę, że funkcja ta będzie często używana przez zwykłych programistów i jest dla nich przydatna.

Powiązane problemy