2010-08-04 43 views
19

Tôi hiện đang phát triển một ứng dụng Android sử dụng API bản đồ của Google.Cách phát hiện thiết bị Android cho dù nó hỗ trợ bản đồ google API

Tôi tự hỏi làm tất cả các thiết bị Android hỗ trợ API bản đồ, bởi vì api này là một api optinal và nó là một add-on cho nền tảng này.

Tôi lo lắng rằng ứng dụng của tôi sẽ không thể chạy trên thiết bị đó.

Những gì tôi cần biết là lập trình phát hiện thời tiết API bản đồ hỗ trợ thiết bị và bắt ngoại lệ và thực hiện một việc khác.

Bởi vì, việc sử dụng khả năng bản đồ chỉ là một trong những tính năng của ứng dụng, tôi muốn để những thiết bị không hỗ trợ bản đồ api vẫn có thể tải xuống và chạy ứng dụng của tôi.

Mọi nhận xét hoặc đề xuất đều được chào đón

Trả lời

2

Cảm ơn tất cả các bạn đã giúp đỡ! tất cả các đề xuất của bạn rất hữu ích cho tôi !!

Tôi đã viết một ứng dụng đơn giản có thể triển khai trên trình mô phỏng API không có Google-Map và phát hiện sự hiện diện của Google API một cách có vấn đề.

Những gì tôi đã làm là tôi xác định <uses-library android:name="com.google.android.maps" android:required="false" />

(nhưng android "yêu cầu" thuộc tính chỉ hoạt động cho 2.1 và không làm việc cho 1,6. Tôi sẽ cần phải tìm hiểu xem tại sao. Cos khi tôi đã nhìn vào tài liệu , nó nói rằng điều này được hỗ trợ bởi 1.6)

Vì vậy, tôi có thể triển khai ứng dụng trên trình mô phỏng.

Thứ hai, tôi tạo ra một hoạt động bản đồ được gọi là HelloMaps Trong hoạt động chính của tôi

try{ 
    mapActivity = new Intent(TestApp.this, HelloMaps.class); 
    startActivityForResult(mapActivity, 0); 
}catch(NoClassDefFoundError e){ 
(Toast.makeText(TestApp.this, "Google Map API not found", Toast.LENGTH_LONG)).show(); 
} 

này sẽ bắt các ngoại lệ và cho tôi biết rằng thiết bị không thể chạy hoạt động bản đồ.

+0

bạn đã quản lý để làm cho nó hoạt động trên tab thiên hà? –

+2

Giải pháp này không tốt đủ, và khá bẩn! – TacB0sS

0

API tùy chọn chỉ áp dụng cho trình giả lập theo như tôi biết. 2 phiên bản API khác nhau chỉ dành cho trình giả lập, tất cả các thiết bị thực phải có API bản đồ Tôi nghĩ rằng

+0

Không .. Ví dụ, Archos 5IT (hoặc một số máy tính bảng khác) không có Google Maps (và không có Android Matket). –

+0

Có. một số máy tính bảng không có Google Maps. Tôi đã thử nghiệm trên một thiết bị máy tính bảng thực sự, khi tôi cài đặt hoạt động bản đồ của mình, nó cho phép tôi cài đặt thông báo lỗi không thành công. –

+0

Lệnh Casio G'Zone không đi kèm với Google Maps được cài đặt sẵn, nó đã cài đặt bản đồ B # $ #% ## ing (và tôi không thể gỡ cài đặt nó!). –

2

Bạn nói đúng, một số Thiết bị, như Archos 5IT và Some Tablet không có Google Maps, Android Market, v.v ...

Đây là mã của tôi. BelgianMap là một MapActivity:

try { 
    Intent i = new Intent(InfoGare.this, BelgianMap.class); 
    startActivityForResult(i, 0); 
} 
catch(ActivityNotFoundException e) { 
    Toast.makeText(context, "Google Map not found", Toast.LENGTH_LONG).show(); 
} 

Nhưng có lẽ có một cách khác để thấy rằng tại việc tạo ra các ứng dụng của bạn và hiển thị một thông điệp. Điều đó có thể tốt hơn.

+0

Điều này sẽ hoạt động và có dự phòng tốt. Tuy nhiên, nếu bạn không muốn người dùng có thể sử dụng ứng dụng thì giải pháp tôi đăng có thể phù hợp hơn và tôi nghĩ điều đó là cần thiết nếu bạn đang sử dụng API googlemaps. – stealthcopter

+0

Bạn đã đúng! Cảm ơn rất nhiều thông tin, điều đó sẽ giúp tôi rất nhiều! –

+1

Cảm ơn rất nhiều. mã của bạn làm việc cho tôi. nhưng tôi cần phải bắt NoClassDefFoundError thay thế. –

0

Nếu bạn đang sử dụng GoogleMaps trong ứng dụng của bạn, bạn nên bao gồm trong manifest.xml của bạn bên trong các thẻ ứng dụng

<uses-library android:name="com.google.android.maps" /> 

này hoặc là sẽ ngăn chặn người dùng từ cài đặt ứng dụng của bạn hoặc nhìn thấy nó trên thị trường, không chắc chắn, có thể cả hai.

+1

Có, bạn đã đúng. Thị trường Android sẽ lọc ứng dụng cho người dùng. Tuy nhiên, tôi muốn cho phép người dùng tải xuống ứng dụng của mình không chỉ từ thị trường mà còn từ trang web của tôi. Bởi vì, việc sử dụng khả năng bản đồ chỉ là một trong những tính năng của ứng dụng của tôi, tôi muốn cho phép những thiết bị không hỗ trợ bản đồ api vẫn có thể tải xuống và chạy ứng dụng của tôi với các tính năng khác của ứng dụng của tôi. –

+1

android: required = "false" – hackbod

+0

android: required = "false" đã giúp tôi cài đặt ứng dụng bản đồ của mình lên trình mô phỏng không hỗ trợ api không có google (2.1), ít nhất tôi không nhận được thông báo lỗi "Thiếu thư viện được chia sẻ" . Tuy nhiên, thuộc tính này không hoạt động cho 1.6 bằng cách nào đó, tôi không biên dịch, tôi nhận được "Không tìm thấy định danh resouce cho thông báo lỗi 'bắt buộc' khi tôi biên soạn dự án –

1

này đã làm việc cho tôi:

Sử dụng (cung cấp tài liệu?) Sử dụng thư viện android: name = "com.google.android.maps" android: yêu cầu = "false" trong biểu hiện. Điều này sẽ cho phép cài đặt trong thiết bị không hỗ trợ bản đồ-api.

Sau đó kiểm tra này ra: http://android-developers.blogspot.com.ar/2009/01/can-i-use-this-intent.html

Bạn vẫn có thể có tất cả các bạn đang bản đồ-api nguyên vẹn trong ứng dụng (không cần cho 2 phiên bản), chỉ cần mã UI của bạn để ngăn chặn chạy nó. (Trong trường hợp của tôi, tôi chuyển sang màu xám). Như đã nói, kỹ thuật được nêu ở trên dự đoán một cách hiệu quả một cái gì đó sẽ không hoạt động, và cho phép bạn trả lời (không có FC), thay vì chỉ phản ứng với một vấn đề.

15

Tôi đã sử dụng sau đây giải pháp ngoài việc mô tả

<uses-library android:name="com.google.android.maps" android:required="false"/> 

trong câu trả lời khác:

public void mapClick(View view) 
{ 
    try 
    { 
     // check if Google Maps is supported on given device 
     Class.forName("com.google.android.maps.MapActivity"); 

     this.startActivity(new Intent(this, MyMapActivity.class)); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     UIUtils.showAlert(this, R.string.google_maps_not_found); 
    } 
} 
+0

điều này dường như không thành công trên tab samsung galaxy với android 3.2 và trên virtualbox với android x86 2.2 – max4ever

+0

Làm thế nào điều này có thể thất bại? các lớp tồn tại, hoặc không ... Có lẽ một kiểm tra null có thể được thêm vào nếu lớp là null sau đó ném một ngoại lệ trong trường hợp nó là null. Điều này chỉ đơn giản là không thể thất bại, nếu không, Java sẽ là một ngôn ngữ rất què. ;) – TacB0sS

+1

Có thể anh ta có nghĩa là: "nó không phát hiện được sự hiện diện của Google Maps, khi nào cần, vì nó hiện diện" ?? –

5

tôi cần để xem nếu thư viện đã tồn tại trước khi thực hiện bất kỳ sự kêu gọi, vì vậy tôi có thể lấp đầy liên quan sở thích trước khi bàn tay. Đây là mã tôi đã đưa ra để kiểm tra.

public static boolean hasSystemSharedLibraryInstalled(Context ctx, 
     String libraryName) { 
    boolean hasLibraryInstalled = false; 
    if (!TextUtils.isEmpty(libraryName)) { 
     String[] installedLibraries = ctx.getPackageManager() 
       .getSystemSharedLibraryNames(); 
     if (installedLibraries != null) { 
      for (String s : installedLibraries) { 
       if (libraryName.equals(s)) { 
        hasLibraryInstalled = true; 
        break; 
       } 
      } 
     } 
    } 
    return hasLibraryInstalled; 
} 

Và sau đó tôi kiểm tra xem com.google.android.maps đã được cài đặt chưa.

0

Bằng cách sử dụng adb, Để in tất cả các thư viện hệ thống:

adb shell cmd package list libraries 

Nếu điện thoại của bạn hỗ trợ Google Maps, bạn sẽ thấy dòng này:

library:com.google.android.maps 
Các vấn đề liên quan