어디서나 패키지 이름을 얻는 방법?


346

Context.getApplicationContext ()View.getContext () 의 가용성을 알고 있으며 실제로 Context.getPackageName () 을 호출 하여 응용 프로그램의 패키지 이름을 검색 할 수 있습니다 .

객체 View또는 Activity객체를 사용할 수 있는 메소드에서 호출하면 작동 하지만 View또는 no가있는 완전히 독립적 인 클래스에서 패키지 이름을 찾으려면 Activity직접 또는 간접적으로 그렇게 할 수 있습니까?


7
허용되는 답변으로 인해 애플리케이션이 때때로 충돌 할 수 있습니다. AddDev & Turbo의 의견을 읽고 솔루션을 제안 해 주셔서 감사합니다.
nikib3ro

1
다른 옵션이 없을 수도 있지만 모범 사례로 이것을 마지막 Context 지점에서 필요한 방식으로 클래스에 전달하는 것이 좋습니다. 정적 방식으로 컨텍스트를 모르는 클래스에서 런타임 컨텍스트 정보에 액세스하고 있습니다. 나에게 악취가납니다. 다른 방법은 그것을 어딘가에 하드 코딩하는 것입니다.
Adam

답변:


488

아이디어는 기본 활동에 정적 변수가 있고 패키지 이름으로 인스턴스화하는 것입니다. 그런 다음 해당 변수를 참조하십시오.

기본 활동의 onCreate()방법 으로 초기화해야합니다 .

수업 전 세계 :

public static String PACKAGE_NAME;

그때..

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    PACKAGE_NAME = getApplicationContext().getPackageName();
}

그런 다음을 통해 액세스 할 수 있습니다 Main.PACKAGE_NAME.


3
이것은 현재 가장 실용적인 솔루션 인 것 같지만 활동의 하위 클래스를 만들어야합니다 ... + 1.
ef2011

1
비슷한 참조를 찾았습니다 : stackoverflow.com/questions/2002288/…
ef2011

13
나의 이해는 즉 final초기화 - 수, 그것은 불변하게 만 생성자한 번만 . onCreate()생성자가 아닙니다. 내가 틀렸다면 정정하십시오.
ef2011

79
이 접근 방식은 올바르지 않습니다. 예를 들어, 임시 활동 상태 일 때 응용 프로그램이 백그라운드로 이동 한 다음 복원되는 경우입니다. 기본 활동의 onCreate ()를 호출 할 수 없으며 PACKAGE_NAME이 (가) null입니다. 또한 응용 프로그램에 10 개의 진입 점이 있고 명확한 "주요 활동"이없는 경우 어떻게해야합니까? 올바른 질문에 대한이 질문에 대한 답변을 확인할 수 있습니다.
Addev

3
@Turbo는 안드로이드가 프로세스를 종료 onCreate하면 어쨌든 다시 호출해야 하므로이 솔루션은 여전히 ​​문제가되지 않습니다.
John Leehey

276

gradle-android-plugin을 사용하여 앱을 빌드하면

BuildConfig.APPLICATION_ID

모든 범위에서 패키지 이름을 검색합니다. 정적입니다.


23
그것이 올바른 방법입니다. 받아 들여 져야합니다.
aberaud

4
참고 : 다중 플레이버 빌드의 경우 플레이버의 패키지 이름이 아닌 기본 구성의 패키지 이름 (BuildConfig 클래스에 액세스하는 데 사용되는 가져 오기에 따라 다름)이 리턴됩니다.
Rolf ツ

2
@Rolf은 사실이 아니다ツ, 그것은 응용 프로그램의 오른쪽 패키지 이름을 반환합니다;) 어쩌면 당신은 당신의 자바 클래스의 패키지 이름으로 착각
Billda

29
라이브러리 프로젝트에서 이것을 사용하면 조심하십시오-작동하지 않습니다.
zyamys 2016 년

6
프로젝트 내부의 여러 모듈에서도 이것을 사용할 경우주의하십시오.
user802421 2016 년

68

"어디에나"라는 단어가 있으면 명시 적 Context(예 : 백그라운드 스레드)이 없는 것을 의미 하는 경우 프로젝트에서 다음과 같이 클래스를 정의해야합니다.

public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}

그런 다음 탭 에서 필드 manifest에이 클래스를 추가해야합니다 . 또는 XML을 편집하고 넣습니다.NameApplication

<application
    android:name="com.example.app.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    .......
    <activity
        ......

어디서나 전화 할 수 있습니다

String packagename= MyApp.getContext().getPackageName();

도움이 되길 바랍니다.


이것은 스레드 안전하지 않지만 나중에이 활동으로 백그라운드 스레드가 시작되면 벗어날 수 있습니다.
tomwhipple

3
인스턴스에 대한 참조는 앱을 시작할 때 가장 먼저 설정되므로 스레드 안전
Addev

17
이 문제에 따라 : code.google.com/p/android/issues/detail?id=8727 ContentProvider 객체는 Application 객체보다 먼저 생성되지만 문서와는 대조적으로 디자인에 따라 생성됩니다. 이로 인해 ContentProvider 초기화 중에 getInstance ()가 호출 된 경우 인스턴스가 여전히 설정 해제 될 수 있습니다.
Carl

3
에 대한 설명서 Application.onCreate()가이를 반영하여 변경되었습니다. 이제는 "응용 프로그램, 서비스 또는 수신자 객체 (응용 프로그램 공급자 제외) 전에 응용 프로그램을 시작할 때 호출됩니다"라고 명시되어 있습니다.
Paul Lammertsma

2
어떤 액티비티가 실행 중인지에 상관없이 컨텍스트가 종료되지 않기 때문에 이것은 선택된 답변이어야합니다.
Elad Nava

43

gradle build를 사용하는 경우 이것을 사용 BuildConfig.APPLICATION_ID하여 응용 프로그램의 패키지 이름을 얻으십시오.


6
응용 프로그램 ID와 패키지 이름은 다릅니다. 애플리케이션 ID는 gradle.build 파일을 통해 정의되며 패키지 이름은 매니페스트에 정의됩니다. 그것들은 종종 같은 가치를 가지지 만, 더 복잡한 빌드 시나리오에서는 종종 다릅니다. 패키지 이름은 변경하지 않고 다른 빌드 구성에 다른 응용 프로그램 ID를 할당 할 수 있습니다.
Uli

3
@Uli 좀 더 자세한 도구로
Kevin Lee

10
@Uli 즉, app.gradle의 applicationId가 AndroidManifest.xml 내부의 packageName을 연기하더라도 context.getPackageName ()을 호출하면 AndroidManifest.xml 내부의 packageName이 아니라 applicationId가 반환됩니다. 새로운 빌드 시스템의 요점은 둘 다를 분리하는 것이 었습니다. 따라서 applicationId는 Google Play 및 설치된 기기에 알려진 앱의 실제 패키지 이름입니다. 배포 후에는 변경할 수 없습니다. 내 요점은 BuildConfig.APPLICATION_ID를 사용하는 것이 좋습니다. 내가 틀렸다면 알려주십시오 (:
Kevin Lee

2
@kevinze 완전히 정확합니다! 다시 확인하기 위해 테스트를 실행했습니다. 설명 / 수정 주셔서 감사합니다.
Uli

5
private String getApplicationName(Context context, String data, int flag) {

   final PackageManager pckManager = context.getPackageManager();
   ApplicationInfo applicationInformation;
   try {
       applicationInformation = pckManager.getApplicationInfo(data, flag);
   } catch (PackageManager.NameNotFoundException e) {
       applicationInformation = null;
   }
   final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)");
   return applicationName;

}

4

패키지 이름을 다음과 같이 얻을 수 있습니다.

$ /path/to/adb shell 'pm list packages -f myapp'
package:/data/app/mycompany.myapp-2.apk=mycompany.myapp

옵션은 다음과 같습니다.

$ adb
Android Debug Bridge version 1.0.32
Revision 09a0d98bebce-android

 -a                            - directs adb to listen on all interfaces for a connection
 -d                            - directs command to the only connected USB device
                                 returns an error if more than one USB device is present.
 -e                            - directs command to the only running emulator.
                                 returns an error if more than one emulator is running.
 -s <specific device>          - directs command to the device or emulator with the given
                                 serial number or qualifier. Overrides ANDROID_SERIAL
                                 environment variable.
 -p <product name or path>     - simple product name like 'sooner', or
                                 a relative/absolute path to a product
                                 out directory like 'out/target/product/sooner'.
                                 If -p is not specified, the ANDROID_PRODUCT_OUT
                                 environment variable is used, which must
                                 be an absolute path.
 -H                            - Name of adb server host (default: localhost)
 -P                            - Port of adb server (default: 5037)
 devices [-l]                  - list all connected devices
                                 ('-l' will also list device qualifiers)
 connect <host>[:<port>]       - connect to a device via TCP/IP
                                 Port 5555 is used by default if no port number is specified.
 disconnect [<host>[:<port>]]  - disconnect from a TCP/IP device.
                                 Port 5555 is used by default if no port number is specified.
                                 Using this command with no additional arguments
                                 will disconnect from all connected TCP/IP devices.

device commands:
  adb push [-p] <local> <remote>
                               - copy file/dir to device
                                 ('-p' to display the transfer progress)
  adb pull [-p] [-a] <remote> [<local>]
                               - copy file/dir from device
                                 ('-p' to display the transfer progress)
                                 ('-a' means copy timestamp and mode)
  adb sync [ <directory> ]     - copy host->device only if changed
                                 (-l means list but don't copy)
  adb shell                    - run remote shell interactively
  adb shell <command>          - run remote shell command
  adb emu <command>            - run emulator console command
  adb logcat [ <filter-spec> ] - View device log
  adb forward --list           - list all forward socket connections.
                                 the format is a list of lines with the following format:
                                    <serial> " " <local> " " <remote> "\n"
  adb forward <local> <remote> - forward socket connections
                                 forward specs are one of:
                                   tcp:<port>
                                   localabstract:<unix domain socket name>
                                   localreserved:<unix domain socket name>
                                   localfilesystem:<unix domain socket name>
                                   dev:<character device name>
                                   jdwp:<process pid> (remote only)
  adb forward --no-rebind <local> <remote>
                               - same as 'adb forward <local> <remote>' but fails
                                 if <local> is already forwarded
  adb forward --remove <local> - remove a specific forward socket connection
  adb forward --remove-all     - remove all forward socket connections
  adb reverse --list           - list all reverse socket connections from device
  adb reverse <remote> <local> - reverse socket connections
                                 reverse specs are one of:
                                   tcp:<port>
                                   localabstract:<unix domain socket name>
                                   localreserved:<unix domain socket name>
                                   localfilesystem:<unix domain socket name>
  adb reverse --norebind <remote> <local>
                               - same as 'adb reverse <remote> <local>' but fails
                                 if <remote> is already reversed.
  adb reverse --remove <remote>
                               - remove a specific reversed socket connection
  adb reverse --remove-all     - remove all reversed socket connections from device
  adb jdwp                     - list PIDs of processes hosting a JDWP transport
  adb install [-lrtsdg] <file>
                               - push this package file to the device and install it
                                 (-l: forward lock application)
                                 (-r: replace existing application)
                                 (-t: allow test packages)
                                 (-s: install application on sdcard)
                                 (-d: allow version code downgrade)
                                 (-g: grant all runtime permissions)
  adb install-multiple [-lrtsdpg] <file...>
                               - push this package file to the device and install it
                                 (-l: forward lock application)
                                 (-r: replace existing application)
                                 (-t: allow test packages)
                                 (-s: install application on sdcard)
                                 (-d: allow version code downgrade)
                                 (-p: partial application install)
                                 (-g: grant all runtime permissions)
  adb uninstall [-k] <package> - remove this app package from the device
                                 ('-k' means keep the data and cache directories)
  adb bugreport                - return all information from the device
                                 that should be included in a bug report.

  adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]
                               - write an archive of the device's data to <file>.
                                 If no -f option is supplied then the data is written
                                 to "backup.ab" in the current directory.
                                 (-apk|-noapk enable/disable backup of the .apks themselves
                                    in the archive; the default is noapk.)
                                 (-obb|-noobb enable/disable backup of any installed apk expansion
                                    (aka .obb) files associated with each application; the default
                                    is noobb.)
                                 (-shared|-noshared enable/disable backup of the device's
                                    shared storage / SD card contents; the default is noshared.)
                                 (-all means to back up all installed applications)
                                 (-system|-nosystem toggles whether -all automatically includes
                                    system applications; the default is to include system apps)
                                 (<packages...> is the list of applications to be backed up.  If
                                    the -all or -shared flags are passed, then the package
                                    list is optional.  Applications explicitly given on the
                                    command line will be included even if -nosystem would
                                    ordinarily cause them to be omitted.)

  adb restore <file>           - restore device contents from the <file> backup archive

  adb disable-verity           - disable dm-verity checking on USERDEBUG builds
  adb enable-verity            - re-enable dm-verity checking on USERDEBUG builds
  adb keygen <file>            - generate adb public/private key. The private key is stored in <file>,
                                 and the public key is stored in <file>.pub. Any existing files
                                 are overwritten.
  adb help                     - show this help message
  adb version                  - show version num

scripting:
  adb wait-for-device          - block until device is online
  adb start-server             - ensure that there is a server running
  adb kill-server              - kill the server if it is running
  adb get-state                - prints: offline | bootloader | device
  adb get-serialno             - prints: <serial-number>
  adb get-devpath              - prints: <device-path>
  adb remount                  - remounts the /system, /vendor (if present) and /oem (if present) partitions on the device read-write
  adb reboot [bootloader|recovery]
                               - reboots the device, optionally into the bootloader or recovery program.
  adb reboot sideload          - reboots the device into the sideload mode in recovery program (adb root required).
  adb reboot sideload-auto-reboot
                               - reboots into the sideload mode, then reboots automatically after the sideload regardless of the result.
  adb sideload <file>          - sideloads the given package
  adb root                     - restarts the adbd daemon with root permissions
  adb unroot                   - restarts the adbd daemon without root permissions
  adb usb                      - restarts the adbd daemon listening on USB
  adb tcpip <port>             - restarts the adbd daemon listening on TCP on the specified port

networking:
  adb ppp <tty> [parameters]   - Run PPP over USB.
 Note: you should not automatically start a PPP connection.
 <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
 [parameters] - Eg. defaultroute debug dump local notty usepeerdns

adb sync notes: adb sync [ <directory> ]
  <localdir> can be interpreted in several ways:

  - If <directory> is not specified, /system, /vendor (if present), /oem (if present) and /data partitions will be updated.

  - If it is "system", "vendor", "oem" or "data", only the corresponding partition
    is updated.

environment variables:
  ADB_TRACE                    - Print debug information. A comma separated list of the following values
                                 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp
  ANDROID_SERIAL               - The serial number to connect to. -s takes priority over this if given.
  ANDROID_LOG_TAGS             - When used with the logcat option, only these debug tags are printed.

3

문서화되지 않은 방법을 사용할 수 있습니다 android.app.ActivityThread.currentPackageName().

Class<?> clazz = Class.forName("android.app.ActivityThread");
Method method  = clazz.getDeclaredMethod("currentPackageName", null);
String appPackageName = (String) method.invoke(clazz, null);

경고: 응용 프로그램의 기본 스레드에서 수행해야합니다.

아이디어에 대한이 블로그 게시물 덕분에 http://blog.javia.org/static-the-android-application-package/ .


2

@Billda가 언급했듯이 Gradle을 사용하는 사람들은 다음을 통해 패키지 이름을 얻을 수 있습니다.

BuildConfig.APPLICATION_ID

이를 통해 앱 gradle에 선언 된 패키지 이름이 제공됩니다.

android {
    defaultConfig {
        applicationId "com.domain.www"
    }
}

Java 클래스에서 사용하는 패키지 이름을 얻는 데 관심이있는 경우 (때로는와 다릅니다 applicationId)

BuildConfig.class.getPackage().toString()

어떤 것을 사용해야할지 혼란 스러우면 여기를 읽으십시오 .

참고 : 응용 프로그램 ID는 코드의 패키지 이름과 직접 연결되었습니다. 따라서 일부 Android API는 메소드 이름 및 매개 변수 이름에 "패키지 이름"이라는 용어를 사용하지만 실제로는 애플리케이션 ID입니다. 예를 들어, Context.getPackageName () 메소드는 애플리케이션 ID를 리턴합니다. 앱 코드 외부에서 코드의 실제 패키지 이름을 공유 할 필요가 없습니다.


어떤 코드를 사용 했습니까? 정확한 오류를 알려주십시오.
user1506104

1
PackageInfo pinfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
         String sVersionCode = pinfo.versionCode; // 1
         String sVersionName = pinfo.versionName; // 1.0
         String sPackName = getPackageName(); // cz.okhelp.my_app
         int nSdkVersion = Integer.parseInt(Build.VERSION.SDK); 
         int nSdkVers = Build.VERSION.SDK_INT; 

그것이 효과가 있기를 바랍니다.


0

앱을 시작할 때 처음 실행될 자바 모듈을 만듭니다. 이 모듈은 android Application 클래스를 확장하고 모든 전역 앱 변수를 초기화하며 앱 전체의 유틸리티 루틴도 포함합니다.

public class MyApplicationName extends Application {

    private final String PACKAGE_NAME = "com.mysite.myAppPackageName";

    public String getPackageName() { return PACKAGE_NAME; }
}

물론 여기에는 안드로이드 시스템에서 패키지 이름을 얻는 로직이 포함될 수 있습니다. 그러나 위의 코드는 안드로이드에서 얻는 것보다 작고 빠르며 깨끗한 코드입니다.

활동을 실행하기 전에 Android가 애플리케이션 모듈을 실행하도록 AndroidManifest.xml 파일에 항목을 배치하십시오.

<application 
    android:name=".MyApplicationName" 
    ...
>

그런 다음 다른 모듈에서 패키지 이름을 얻으려면 다음을 입력하십시오.

MyApp myApp = (MyApp) getApplicationContext();
String myPackage = myApp.getPackageName();

응용 프로그램 모듈을 사용하면 컨텍스트가 필요하지만없는 모듈에 대한 컨텍스트를 제공합니다.


0

BuildConfig.APPLICATION_ID를 사용하여 어디에서나 패키지 이름을 얻으십시오 (예 : 서비스, 수신자, 활동, 조각 등)

예 : 문자열 PackageName = BuildConfig.APPLICATION_ID;


0

Android.app를 가져 오면 다음을 사용할 수 있습니다. <br/>Application.getProcessName()<br/>

컨텍스트,보기 또는 활동없이 현재 애플리케이션 프로세스 이름을 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.