2012-06-17 15 views
10

Có cách nào để biết ứng dụng đã được tải xuống từ Amazon App Store hay Cửa hàng Google Play không? Tôi có nghĩa là trong ứng dụng riêng của mình, tất nhiên.Làm cách nào để biết ứng dụng đã được tải xuống từ Google Play hay Amazon?

Tôi đã triển khai một ứng dụng cho cả hai trang web và tôi muốn biết từ nơi khách hàng đã tải xuống ứng dụng trong ứng dụng. Tôi biết, tôi có thể triển khai các ứng dụng khác nhau cho mỗi dịch vụ, nhưng điều này bổ sung thêm một số công việc bảo trì có thể tránh được nếu có cách nào đó để giải quyết nó chỉ với một điều kiện trong ứng dụng bằng cùng một gói.

+3

tại sao không chỉ có một biến trong mỗi bản phát hành cho biết nơi nó được tải lên? Hoặc có một OptionPane là người dùng ... –

+9

'PackageManager' và' getInstallerPackageName() 'sẽ cho bạn biết trình cài đặt là gì. Bạn sẽ phải chạy thử nghiệm để xem thử nghiệm nào trả về trong các trường hợp khác nhau của bạn. – CommonsWare

+0

@Fran nếu bạn đã thử nghiệm những gì bạn đã đưa ra? – ahsteele

Trả lời

12

Trong Mã số:

final PackageManager packageManager = getPackageManager(); 

try { 
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0); 
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Play Store 
    } 
} catch (final NameNotFoundException e) { 
    e.printStackTrace(); 
} 

"com.android.vending" cho bạn biết nó đến từ Google Play Store. Tôi không chắc Amazon Appstore là gì, nhưng sẽ dễ dàng kiểm tra bằng cách sử dụng mã trên.

Via ADB:

adb shell pm dump "PACKAGE_NAME" | grep "vending" 

Ví dụ:

adb shell pm dump "com.android.chrome" | grep "vending" 

installerPackageName=com.android.vending 
+0

Điều này mang lại một 'installerPackageName' của' null' khi được đính kèm với trình gỡ lỗi Android Studio và xây dựng trực tiếp tới cả Google Nexus 7 cũng như Kindle Fire HD. Điều đó có được mong đợi khi kết nối với trình gỡ lỗi không? Và nó sẽ trả về các chuỗi hợp pháp khi nó là release.apk? –

+1

Có và không. 'null' được mong đợi khi ứng dụng không được cài đặt thông qua cửa hàng ứng dụng hoặc khi cửa hàng ứng dụng cài đặt không đặt trường. Trình cài đặt được Android Studio sử dụng không đặt trường, vì vậy nó không có giá trị. (Đối với tôi, như được thấy trong tab "Chạy" 'DEVICE SHELL COMMAND: pm install -r" /data/local/tmp/com.mypackage.myapp "') Trong mọi trường hợp, Android Studio gần như chắc chắn sẽ không đặt giá trị để 'com.android.bán hàng tự động, nhưng có nhiều khả năng là 'com.android.studio' hoặc gì đó. – nmr

1

Trong khi ở hầu hết các trường hợp, bạn có thể lấy tên cửa hàng bằng cách bao gồm một tấm séc tương tự như sau:

final PackageManager packageManager = getPackageManager(); 

try { 
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0); 
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Play Store 
    } else if ("com.amazon.venezia".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Amazon Appstore 
    } else { 
     // App was installed from somewhere else 
    } 
} catch (final NameNotFoundException e) { 
    e.printStackTrace(); 
} 

"com.andr oid.vending" là Google Play Store và
'com.amazon.venezia' là Amazon Appstore, và
null khi nó được tải hai chiều

Các kết quả có thể không đáng tin cậy tuy nhiên, như ví dụ trong phiên bản beta thử nghiệm một cửa hàng có thể không đặt giá trị này, và ngoài ra nó có thể sideload ứng dụng của bạn chỉ rõ tên gói của trình cài đặt có thể được hiểu như là một tên cửa hàng:

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK> 

bạn có thể muốn xem xét việc có tên gói khác nhau cho các cửa hàng khác nhau, ví dụ "com.example.yourapp" cho Google và "com.example.yourapp.amazon" cho Amazon - bạn có thể dễ dàng ily đặt những người trong kịch bản Gradle của bạn.