Làm cách nào để lấy id ứng dụng Android?


92

Trong Android, làm cách nào để lấy id của ứng dụng theo chương trình (hoặc theo một số phương pháp khác) và làm cách nào để giao tiếp với các ứng dụng khác bằng id đó?

Câu trả lời:


145

Nếu bạn đang tìm kiếm giá trị được xác định bởi applicationIdgradle, bạn chỉ cần sử dụng

BuildConfig.APPLICATION_ID 

30
Điều này sẽ không được như vậy hữu ích nếu bạn đang viết một thư viện Android
Simon Featherstone

Tôi sử dụng cái này để lấy applicationId trong bài kiểm tra Espresso của mình: private val targetContext = toolsmentation.getTargetContext () private val applicationId = targetContext.getPackageName ();
a_subscriber

@SimonFeatherstone bạn đã bao giờ tìm hiểu cách thực hiện điều đó từ một mô-đun chưa?
Mihai Fischer

@MihaiFischer bạn cần tạo một hàm để khởi tạo mô-đun / thư viện và sau đó chuyển loại thông tin đó vào.
Simon Featherstone

48

Nếu application idbạn đang đề cập đến package name, bạn có thể sử dụng phương pháp Context::getPackageName( http: // http: //developer.android.com/reference/android/content/Context.html#getPackageName%28%29 ).

Trong trường hợp bạn muốn giao tiếp với ứng dụng khác, có nhiều cách:

  1. Bắt đầu một hoạt động của một ứng dụng khác và gửi dữ liệu trong "Phần mở rộng" của "Ý định"
  2. Gửi chương trình phát sóng với hành động / danh mục cụ thể và gửi dữ liệu trong các tính năng bổ sung
  3. Nếu bạn chỉ cần chia sẻ dữ liệu có cấu trúc, hãy sử dụng nhà cung cấp nội dung
  4. Nếu ứng dụng khác cần liên tục chạy ở chế độ nền, hãy sử dụng Máy chủ và "ràng buộc" bạn với dịch vụ.

Nếu bạn có thể giải thích yêu cầu chính xác của mình, cộng đồng sẽ có thể giúp bạn tốt hơn.


Điều gì sẽ xảy ra nếu tôi muốn hiển thị danh sách ứng dụng và cần có id dưới dạng số nguyên, giống như tất cả các bộ điều hợp danh sách cần? Tôi có thể sử dụng thời gian cài đặt, nhưng nó thuộc loại dài. Truyền nó sang int vẫn giúp được chứ?
nhà phát triển android

4
tên gói không phải lúc nào cũng là applicationId, khi bạn đặt nó qua build.gradle!
Jemshit Iskenderov

2
Trên thực tế, Context.getPackageName() không trả lại ID ứng dụng và không tên gói (mặc dù chúng thường giống nhau). Tên hơi khó hiểu của phương pháp là kế thừa. Nguồn: developer.android.com/studio/build/application-id
LoPoBo

Bối cảnh :: getPackageName không làm việc nếu bạn sử dụng Kotlin, nó sẽ trả về "chức năng getPackageName (Kotlin phản ánh không có sẵn)"
Derek Zhu

6

Tôi không chắc bạn đang đề cập đến "id ứng dụng" nào, nhưng để biết số nhận dạng duy nhất của ứng dụng, bạn có thể sử dụng:

phương thức getApplication (). getPackageName () từ hoạt động hiện tại của bạn


2
mỗi ứng dụng đã cài đặt có một id duy nhất ... liệu có thể lấy id duy nhất của ứng dụng từ ứng dụng khác không
arams 12-08-09

3
Phải không getApplicationContext().getPackageName()?
superarts.org

Giả sử bạn có các loại bản dựng như bản phát hành hoặc bản gỡ lỗi và bạn đã thêm hậu tố, ví dụ: "gỡ lỗi" để phân biệt nó với ứng dụng chính, trong trường hợp đó getpackageName () sẽ cung cấp cho bạn originalpackagename.debug
Aman Verma



1

Nếu không, bạn có thể nhận được id của quá trình ứng dụng của bạn chạy trong:

final static int android.os.Process.myPid ()
Trả về số nhận dạng của quá trình này, có thể được sử dụng với killProcess (int) và sendSignal (int, int).


1

Tôi không chắc bạn cần ID ứng dụng / cài đặt để làm gì, nhưng bạn có thể xem lại các khả năng hiện có trong một bài viết tuyệt vời từ các nhà phát triển Android:

Tóm lại:

  • UUID.randomUUID() để tạo id vào lần đầu tiên một ứng dụng chạy sau khi cài đặt và truy xuất đơn giản sau đó
  • TelephonyManager.getDeviceId() cho số nhận dạng thiết bị thực tế
  • Settings.Secure.ANDROID_ID trên các thiết bị tương đối hiện đại

0

Các PackageInfo.sharedUserIdlĩnh vực sẽ hiển thị ID người dùng được gán trong biểu hiện .

Nếu bạn muốn hai ứng dụng có cùng userId để chúng có thể xem dữ liệu của nhau và chạy trong cùng một quy trình, thì hãy gán chúng cùng một userId trong tệp kê khai:

android:sharedUserId="string"

Hai gói có cùng sharedUserId cũng cần phải có cùng chữ ký.

Tôi cũng khuyên bạn nên đọc ở đây để có một hướng đi đúng đắn.


2 ứng dụng khác nhau sử dụng cùng một tên gói có nghĩa là, các ứng dụng có thể chia sẻ dữ liệu? ...
arams 13-08-09

Không. Nếu hai ứng dụng có cùng ShareUserId VÀ được ký bằng cùng một chữ ký thì có thể chia sẻ dữ liệu. Tên gói không phải là một vấn đề.
Will

0

Nếu mục đích toàn bộ là giao tiếp dữ liệu với một số ứng dụng khác, hãy sử dụng phương thức sendBroadcast của Intent.


0

Nếu bạn đang sử dụng hệ thống xây dựng ** Gradle mới thì getPackageNamekỳ lạ sẽ trả về Id ứng dụng chứ không phải tên gói. Vì vậy, câu trả lời của MasterGaurav là đúng nhưng anh ấy không cần bắt đầu bằng ++

Nếu theo id ứng dụng, bạn đang đề cập đến tên gói ...

Xem thêm về sự khác biệt tại đây .

** không quá mới vào thời điểm này

++ Tôi nhận thấy rằng câu trả lời của anh ấy có ý nghĩa hoàn hảo vào năm 2011


0

Android App ES File Explorer hiển thị tên gói Android trong phần Ứng dụng người dùng, phần này hữu ích cho Bitwarden. Bitwarden gọi đây là "ID gói ứng dụng android (hoặc tên gói)".


0

Để theo dõi lượt cài đặt, bạn có thể ví dụ: sử dụng UUID làm mã định danh và chỉ cần tạo một cái mới vào lần đầu tiên một ứng dụng chạy sau khi cài đặt. Đây là bản phác thảo của một lớp có tên “Cài đặt” với một phương thức tĩnh là Install.id (Bối cảnh ngữ cảnh). Bạn có thể tưởng tượng việc ghi nhiều dữ liệu cài đặt cụ thể hơn vào tệp INSTALLATION.

public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {

    if (sID == null) {  
       File installation = new File(context.getFilesDir(), INSTALLATION);
       try {
           if (!installation.exists())
               writeInstallationFile(installation);
           sID = readInstallationFile(installation);
       } catch (Exception e) {
           throw new RuntimeException(e);
       }
    }
   return sID;
}

private static String readInstallationFile(File installation) throws IOException {
   RandomAccessFile f = new RandomAccessFile(installation, "r");
   byte[] bytes = new byte[(int) f.length()];
   f.readFully(bytes);
   f.close();
   return new String(bytes);
}

private static void writeInstallationFile(File installation) throws IOException {
   FileOutputStream out = new FileOutputStream(installation);
   String id = UUID.randomUUID().toString();
   out.write(id.getBytes());
   out.close();
}

}

Yon có thể xem thêm tại https://github.com/MShoaibAkram/Android-Unique-Application-ID

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.