2013-05-08 10 views
9

Mam pytanie, czy jest możliwe, aby odczytać nazwę pakietu wewnątrz AndroidManifest.xmlAndroid: Czy jest możliwe aby odczytać nazwę pakietu wewnątrz AndroidManifest.xml złożyć

Znaczy

Mam AndroidManifest.xml jako poniżej

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mypackagename" 
    android:installLocation="auto" 
    android:versionCode="1" 
    android:versionName="1.0" > 

.... 

</manifest> 

teraz muszę dodać pozwolenie (używany do GCM)

<permission 
     android:name="MYPACKAGENAME.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

Czy można zastąpić MYPACKAGENAME z com.mypackagename dynamicznie w powyższym znaczniku uprawnień.

+0

nr. nie żebym o tym wiedział. możesz być jednak w stanie przechowywać go w pliku strings.xml. – Shark

+0

Nie można zaktualizować pliku manifestu w sposób dinamiczny. – hardartcore

+0

AFAIK nie możemy zapisać dostępu do nazwy pakietu nawet z pliku string.xml czy jest to możliwe? –

Odpowiedz

-2

Twoja odpowiedź jest NO ..

Po publikowania aplikacji, nie można zmienić nazwę pakietu. Nazwa pakietu określa tożsamość twojej aplikacji, więc jeśli ją zmienisz, zostanie ona uznana za inną, a użytkownicy poprzedniej wersji nie mogą zaktualizować jej do nowej wersji.

Innymi słowy

Android uważa aplikację z inną nazwą pakiet jak inną aplikację całkowicie

EDIT:

Czy Context.getPackageName() szukasz

+1

Moim zamiarem nie jest edycja, ale przeczytanie go w tym samym pliku AndroidManifest.xml. –

+0

możesz otrzymać nazwę pakietu programowo, ale nie możesz ustawić ani edytować w pliku manifestu ANdroida – CRUSADER

-1

AndroidManifest.xml jest (jak sama nazwa wskazuje) do deklarowania i manifestowania rzeczy.

Czytanie nazwy pakietu dynamicznie w aplikacji jest możliwe, ponieważ zadeklarowano to w pliku manifestu.

Teoretycznie nie można odczytać ani przekazać wartości w swoim AndroidManifest. Będziesz musiał wykonać dynamiczne operacje wewnątrz aplikacji.

19

można usunąć nazwę pakietu część nazwy:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mypackagename"> 
    ... 

    <permission 
     android:name=".permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    ... 
</manifest> 

Po uruchomieniu swoje nazwisko z uprawnień. automatycznie otrzymuje prefiks z nazwą pakietu.

Nie można zmienić nazwy pakietu dynamicznie, ale można zrobić pewne rzeczy, definiując applicationId w pliku build.gradle, a następnie dodając nazwy w manifeście systemu Android za pomocą $ {applicationId}.

w build.gradle:

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.2" 
    productFlavors { 
     development { 
      applicationId = "com.mypackage.development" 
     } 
    } 
} 

a potem w swoim AndroidManifest.xml mają:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mypackagename"> 
    ... 

    <permission 
     android:name="${applicationId}.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    ... 
</manifest> 

można znaleźć nieco więcej tutaj: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

Później podejście pozwoli możesz uruchamiać programowy wygląd swojej aplikacji obok swojej wersji produkcyjnej. Mam nadzieję, że to pomoże.

+0

Dobre pytanie, spotykam ten sam problem kiedy ustawić nazwę pakietu na 'android: host = {nazwa_pakietu}' w filtrze intencyjnym – Ninja

+0

@miko Hej , czy możesz potwierdzić, że jest "Kiedy zaczynasz swoją nazwę uprawnienia z., to automatycznie otrzymuje prefiks z nazwą pakietu." to prawda dla każdego łańcucha tworzonego w AndroidManifest? – Geri

+0

To rozwiąże ogromną liczbę problemów po mojej stronie. Czy jest na to jakaś dokumentacja? – Geri

0

można używać względnego użycia.

Static:

<permission 
     android:name="com.mypackagename.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

względna:

<permission 
     android:name=".permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

gdy nazwa zaczyna się od kropki jest jak umieścić nazwapakietu zadeklarowane w

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mypackagename" 
    android:installLocation="auto" 
    android:versionCode="1" 
    android:versionName="1.0" > 

.... 

</manifest> 
2

Można użyć ${applicationId} zastąpić pakiet imię i nazwisko, np.

<permission 
     android:name="${applicationId}.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
Powiązane problemy