Bạn có thể sử dụng cách tiếp cận khác. Đặt thông tin meta trong tệp kê khai ứng dụng của bạn thay vì đặt danh mục cho hoạt động của bạn. Lưu ý rằng xóa thông tin gói không thể được lấy ra nữa (nếu ứng dụng chưa được xóa với cờ DONT_DELETE_DATA)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package.name"
android:versionCode="1"
android:versionName="1" >
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<meta-data
android:name="meta-name"
android:value="meta-value" />
</application>
</manifest>
Thêm một máy thu phát sóng để theo dõi cài đặt gói. Kiểm tra thông tin meta của gói để xem các giá trị của bạn đã có ở đó chưa.
private BroadcastReceiver packageListener = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart());
//Currently being installed or deleted package
String packageName = intent.getData().getEncodedSchemeSpecificPart();
Object value = null;
try {
ApplicationInfo appInfo = getPackageManager().getApplicationInfo(packageName,PackageManager.GET_META_DATA);
//Get meta value if exits
value = appInfo.metaData.get("meta-name");
} catch (NameNotFoundException e) {
Log.e(TAG, "exception occured", e);
}
//check meta info if it is yours
}
}
Như bạn thấy, bất kỳ ứng dụng nào khác cũng có thể đặt siêu dữ liệu trong tệp kê khai để không nhận dạng ứng dụng của bạn một cách an toàn. Cách tốt nhất là kiểm tra chữ ký apk nếu tất cả được ký với cùng một chứng chỉ.
private BroadcastReceiver packageListener = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart());
String packageName = intent.getData().getEncodedSchemeSpecificPart();
Signature[] signatures = null;
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(packageName,PackageManager.GET_SIGNATURES);
signatures = packageInfo.signatures;
} catch (NameNotFoundException e) {
Log.e(TAG, "exception occured", e);
}
//check installed package signature if it matches
}
}
Nguồn
2014-08-07 12:12:11
bạn có giải pháp cho việc này không? –
Làm cách nào để chúng tôi có thể lập danh mục của bất kỳ ứng dụng nào? –
@ Sam-In-TechValens bạn không thể lấy danh mục bằng cách chỉ sử dụng tên gói mà bạn có thể làm là trích xuất tên gói sử dụng danh mục. Vì vậy, những gì tôi đã thực hiện trong phát sóng, tôi đã cài đặt gói và cũng lấy tất cả các gói bằng cách sử dụng danh mục đã định nghĩa trong danh sách và khớp với gói mới nhất được cài đặt nếu nó khớp với nghĩa là ứng dụng được cài đặt bây giờ là ứng dụng của riêng tôi. – pyus13