2012-05-11 32 views
15

Đây là vấn đề đơn giản khi kiểm tra các gói đã cài đặt trên thiết bị ... trước khi tôi nâng cấp hệ điều hành lên 2.3.5, tôi có thể định vị Thị trường/chơi cửa hàng, sử dụng mã này:Không thể xác định xem cửa hàng Google Play có được cài đặt hay không trên thiết bị Android

private static final String GooglePlayStorePackageName = "com.google.market"; 

void someMethod() { 
    packageManager = getApplication().getPackageManager(); 
    List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); 
    for (PackageInfo packageInfo : packages) { 
     if (packageInfo.packageName.equals(GooglePlayStorePackageName)) { 
      googlePlayStoreInstalled = true; 
      break; 
     } 
    } 
} 

Đối với một số lý do sau khi cập nhật, tôi chỉ đơn giản là không thể tìm ra để gói tên để chỉ các ứng dụng được cài đặt, mặc dù nó là trên thiết bị, và tôi có thể tiếp cận thị trường.

Tên gói có thay đổi không? hoặc có lẽ tôi đang nhìn vào điều này một cách sai lầm?

Xin cảm ơn,

Adam.

UPDATE:

Đó là một cách ngu ngốc để kiểm tra xem một gói được cài đặt ... một cách tốt hơn là:

protected final boolean isPackageInstalled(String packageName) { 
    try { 
     application.getPackageManager().getPackageInfo(packageName, 0); 
    } catch (NameNotFoundException e) { 
     return false; 
    } 
    return true; 
} 
+0

Trên mã đang làm việc hoàn toàn tốt đẹp ... thanx – pioneerBhawna

Trả lời

31

Hãy nhận biết rằng gần 5 năm mã cũ này là không tối ưu và Google không thích khi bạn kiểm tra tất cả các gói đã cài đặt mà không có lý do chính đáng. Vui lòng kiểm tra các câu trả lời khác.

Tên gói đã thay đổi, nó bây giờ com.android.vending


Hãy thử:

private static final String GooglePlayStorePackageNameOld = "com.google.market"; 
private static final String GooglePlayStorePackageNameNew = "com.android.vending"; 

void someMethod() { 
    PackageManager packageManager = getApplication().getPackageManager(); 
    List<PackageInfo> packages = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); 
    for (PackageInfo packageInfo : packages) { 
     if (packageInfo.packageName.equals(GooglePlayStorePackageNameOld) || 
      packageInfo.packageName.equals(GooglePlayStorePackageNameNew)) { 
      googlePlayStoreInstalled = true; 
      break; 
     } 
    } 
} 
+0

đó có nghĩa là bây giờ tôi phải kiểm tra sự tồn tại của cả hai ứng dụng ... Hmm ... không rất đẹp! – TacB0sS

+2

Nhưng tại sao bạn sử dụng cờ 'PackageManager.GET_UNINSTALLED_PACKAGES' trong' getInstalledPackages() 'và không chỉ' getInstalledPackages (0) '? – Prizoff

+6

Nhân tiện, không phải là '" com.google.vending "', nhưng '" com.android.vending "'. Không chắc chắn về tên cũ. – Prizoff

9

GooglePlayServices có một lớp tiện ích để xử lý việc này và cũng có thể cung cấp các hộp thoại báo lỗi chiếm tới hiển thị theo trạng thái của dịch vụ phát trong thiết bị.

API Reference:http://developer.android.com/reference/com/google/android/gms/common/GooglePlayServicesUtil.html

+1

Điều này rất gần đây ... Tôi sắp thử nghiệm nó trong vài ngày tới ... cho đến nay mã trông giống như một mớ hỗn độn lớn! – TacB0sS

+0

Nó thực sự là! Nhưng tốt, là những gì Google được sử dụng để làm :) – saiyancoder

+4

Lưu ý rằng các nhà phát triển không nên nhầm lẫn giữa ứng dụng cửa hàng Google Play và Dịch vụ của Google Play. GooglePlayServicesUtil.isGooglePlayServicesAvailable() kiểm tra cái thứ hai có thể là chỉ báo nhưng không phải là yêu cầu. Tuy nhiên, lớp này có các hằng số cho cả hai tên gói. IMHO, nếu bạn muốn kiểm tra ứng dụng cửa hàng Google Play hiện có (ví dụ: vì bạn muốn khởi chạy thị trường: // intent, hãy sử dụng PackageManager với GOOGLE_PLAY_STORE_PACKAGE. – Michael

0

Sử dụng mã này, bạn có thể kiểm tra Dịch vụ Google Play được cài đặt trên thiết bị của bạn hay không.

int val=GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this); 
      if(val==ConnectionResult.SUCCESS) 
      { 
       play_installed=true; 
      } 
      else 
      { 
       play_installed=false; 
      } 
+4

Dịch vụ của Google Play! = Cửa hàng Google Play Bạn có thể cài đặt cửa hàng nhưng không phải GPS và ngược lại OP đã yêu cầu cửa hàng – Michael

4

Như Michael đã nêu trong nhận xét Dịch vụ của Google Play không giống như Cửa hàng Google Play. Sử dụng để xác định có hay không Play Store được cài đặt trên thiết bị của bạn:

public static boolean isPlayStoreInstalled(Context context){ 
    try { 
     context.getPackageManager() 
       .getPackageInfo(GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0); 
     return true; 
    } catch (PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 
+1

Lưu ý rằng điều này yêu cầu bạn thêm 'com.google.android.gms: play- services-base: $ playServicesVersion' cho các phụ thuộc của bạn. (Nó không tạo phụ thuộc thời gian chạy trên các Dịch vụ của Play đang được cài đặt.) – Thomas

+0

@Thomas, không cần thiết bạn có thể thay thế GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE bằng "com.android.vending " –

0

Trong hầu hết các trường hợp chúng tôi muốn tìm hiểu xem Google Play Store được cài đặt hay không để khởi động nó với một số trang ứng dụng cài đặt sẵn.

Tại sao không thể thực hiện điều này:

final String appPackageName = getPackageName(); // get your app package name 
try { 
    Uri uri = Uri.parse("market://details?id=" + appPackageName); 
    startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
} catch (android.content.ActivityNotFoundException anfe) { 
    // Google Play Store is not available. 
} 
Các vấn đề liên quan