AndroidR.78: NGOẠI TUYỆT VỜI: androidmapsapi-ZoomTableManager


134

Ứng dụng của tôi sử dụng Google Maps SDK (v2) vừa bắt đầu gặp sự cố với ngoại lệ này:

Process: com.currentlocation.android, PID: 7328
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
        at com.google.maps.api.android.lib6.gmm6.vector.ct.<init>(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):9)
        at com.google.maps.api.android.lib6.gmm6.vector.cv.a(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):23)
        at com.google.maps.api.android.lib6.gmm6.util.m.run(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):14)
        at java.lang.Thread.run(Thread.java:919)

Trong SDK beta v3, theo dõi ngăn xếp là:

2020-04-23 15:59:06.064 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example, PID: 22717
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
        at com.google.android.libraries.maps.bv.zzbs.<init>(ZoomTable.java:24)
        at com.google.android.libraries.maps.bv.zzbv.zza(ZoomTableQuadTree.java:57)
        at com.google.android.libraries.maps.br.zzd.zza(Unknown Source:4)
        at com.google.android.libraries.maps.hi.zzas.zza(Suppliers.java:7)
        at com.google.android.libraries.maps.br.zza.zzh(SharedMapComponentImpl.java:58)
        at com.google.android.libraries.maps.gu.zzat.zza(RendererFactoryImpl.java:88)
        at com.google.android.libraries.maps.it.zzav.zza(GoogleMapImpl.java:59)
        at com.google.android.libraries.maps.it.zzci.zza(MapFragmentDelegateImpl.java:3)
        at com.google.android.libraries.maps.it.zzcg.zza(MapFragmentDelegateImpl.java:15)
        at com.google.android.libraries.maps.SupportMapFragment$zza.onCreateView(SupportMapFragment.java:15)
        at com.google.android.gms.dynamic.zae.zaa(com.google.android.gms:play-services-base@@17.1.0:4)
        at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaa(com.google.android.gms:play-services-base@@17.1.0:9)
        at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreateView(com.google.android.gms:play-services-base@@17.1.0:25)
        at com.google.android.libraries.maps.SupportMapFragment.onCreateView(SupportMapFragment.java:34)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:310)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2222)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1995)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1951)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2621)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1432)
        at android.app.Activity.performStart(Activity.java:7848)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
2020-04-23 15:59:06.064 E/AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Nguyên nhân là gì?


10
Có lẽ đó là sự cố của Google Maps
Eduardo Herzer

1
Đây là một ứng dụng sản xuất hay chỉ là một thử nghiệm?
user961186

18
Lưu ý: Không đăng câu trả lời "tôi cũng vậy" cho câu hỏi này. Chỉ trả lời câu trả lời câu hỏi nên được đăng dưới dạng câu trả lời.
Wai Ha Lee

3
thông tin cập nhật sẽ có ở đây: suetracker.google.com/issues/154855417
lewkka

2
@UnnightGuest Nếu bạn mở rộng về điều đó một chút, nó có thể tạo ra một câu hỏi hay.
Makyen

Câu trả lời:


83

Chỉnh sửa : sau đây là giải pháp chính thức từ Google ( liên kết )

Tóm lược

Chủ đề SDK của Google Maps gặp sự cố Ứng dụng (ArrayIndexOutOfBoundException) - Cung cấp giải pháp

Sự miêu tả

Vào ngày 23 tháng 4 năm 2020 bắt đầu lúc 11:30 PDT , Google đã phục vụ trong 4 giờ để cập nhật cấu hình của một thành phần di động Maps, gây ra sự cố trong SDK SDK cho Android và iOS. Các ứng dụng trên các thiết bị đã tải xuống phiên bản cấu hình này (trong thời gian ngừng hoạt động) rất dễ gặp sự cố. Giải pháp khắc phục được cung cấp cho SDK SDK cho Android và iOS.

Bản đồ SDK cho Android

Bản đồ SDK cho Android v2 (có trong Dịch vụ Google Play)

Các bản cập nhật cho Dịch vụ Google Play để khắc phục sự cố đã được xuất bản cho tất cả các thiết bị có Google Play Services phiên bản 17.4.55 trở lên. Không có thay đổi về số phiên bản Dịch vụ Google Play trên thiết bị sau khi cập nhật được cài đặt. Không có hành động nào được yêu cầu từ nhà phát triển hoặc người dùng cuối để nhận mô-đun Bản đồ được cập nhật; tuy nhiên, các nhà phát triển có thể xác minh rằng mô-đun có mặt trên một thiết bị nhất định bằng lệnh adb sau:

adb shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider

Bạn sẽ thấy dòng Module Set ID: mapsđược liệt kê trong Module Setsphần.

Module Set ID: maps, Module Set Version: 2015120015120000

Tỷ lệ sự cố của SDK SDK cho Android v2 đã trở lại bình thường.

Đến bây giờ, nếu bạn chưa cập nhật ứng dụng của mình với các cách giải quyết mã phía máy khách được đề cập bên dưới, bạn không cần phải thực hiện thêm hành động nào.

Nếu bạn đã cập nhật ứng dụng của mình với các cách giải quyết, bạn có thể xóa cách khắc phục trong bản cập nhật tiếp theo của ứng dụng (nhưng giữ cho cách giải quyết là an toàn).

SDK bản đồ gói cao cấp cho Android v2 hoặc SDK bản đồ cho Android v3 beta (thư viện tĩnh)

Nếu ứng dụng của bạn sử dụng SDK Premium Plan Maps cho Android v2 hoặc Maps SDK cho Android v3 beta (thư viện tĩnh) và vẫn gặp sự cố, chúng tôi vẫn khuyên bạn nên triển khai các cách giải quyết bên dưới thông qua bản cập nhật cho ứng dụng của bạn. Vì ứng dụng của bạn đang tải phiên bản tĩnh của SDK dễ bị tổn thương trước dữ liệu xấu được lưu trữ trên một số thiết bị, nên chỉ có bản cập nhật cho ứng dụng của bạn có thể giải quyết vấn đề.

Phê duyệt cửa hàng Play

Nếu bạn cập nhật ứng dụng của mình nhưng gặp phải sự chậm trễ phê duyệt của Cửa hàng Play, vui lòng gửi trường hợp hỗ trợ với ID gói của ứng dụng của bạn: Liên hệ với nhóm hỗ trợ . Nhóm hỗ trợ của chúng tôi sẽ leo thang nội bộ yêu cầu của bạn và tiến hành phê duyệt.

Đánh giá tiêu cực trong Cửa hàng Google Play

Một số nhà phát triển ứng dụng đã hỏi về các đánh giá 1 sao trong Cửa hàng Google Play do người dùng cuối để lại do sự cố. Chỉ những bình luận vi phạm chính sách của Google Play [1] mới có thể bị xóa. Bạn cũng có thể gắn cờ các đánh giá lạm dụng trong Play Console [2]. Các ứng dụng sẽ không được tự động xóa khỏi cửa hàng Google Play do đánh giá tiêu cực. Cũng đáng lưu ý rằng việc tính toán xếp hạng đánh giá ứng dụng tổng thể của bạn ủng hộ các đánh giá gần đây, điều đó có nghĩa là xếp hạng của bạn sẽ phục hồi về mức trước sự cố theo thời gian.

[1] Xếp hạng & Đánh giá trên Cửa hàng Play

[2] Báo cáo đánh giá không phù hợp

Bản đồ SDK cho iOS

Tỷ lệ sự cố trên iOS đã trở lại bình thường. Nếu ứng dụng của bạn vẫn gặp sự cố, bạn cần cập nhật và xuất bản ứng dụng của mình với các cách giải quyết mã được truyền đạt tại đây.

Đối với các câu hỏi về việc triển khai hoặc tiến hành ứng dụng của bạn trong Apple App Store, vui lòng liên hệ trực tiếp với Apple.


Với bản cập nhật này, chúng tôi đang đóng vấn đề này. Cảm ơn mọi người vì sự kiên nhẫn của bạn. Nhóm của chúng tôi đang thực hiện một cuộc điều tra nội bộ chuyên sâu về vụ việc này; càng sớm càng tốt, chúng tôi sẽ công bố phân tích của chúng tôi (trong khoảng một tuần). Trong khi đó, nếu bạn có bất kỳ câu hỏi nào, hoặc vẫn đang gặp vấn đề, vui lòng ⁠ gửi một trường hợp hỗ trợ .

Cách giải quyết:

  • Người dùng cuối trên Android có thể xóa dữ liệu của ứng dụng bị ảnh hưởng (không chỉ bộ nhớ cache).

  • Người dùng cuối trên iOS có thể gỡ cài đặt sau đó cài đặt lại (các) ứng dụng bị ảnh hưởng.

  • Nhà phát triển ứng dụng có thể áp dụng các cách giải quyết mã bên dưới để giải quyết vấn đề cho tất cả người dùng cuối của họ.

Mã giải pháp cho iOS:

Vị trí được đề xuất cho mã là trước khi khởi tạo GMSService trong ứng dụng (_: didFinishLaunchingWithOptions :) (Swift) hoặc ứng dụng: didFinishLaunchingWithOptions: (Objective-C). Đặc biệt:

Nhanh:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Mục tiêu-C:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL];
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Mã giải pháp cho Android:

Vị trí được đề xuất cho mã là trong Application.onCreate ():

Java

try {
  SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
  if (!hasFixedGoogleBug154855417.contains("fixed")) {
    File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
    File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
    File corruptedClientParametersData =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data."
              + getBaseContext().getPackageName());
    File corruptedClientParametersDataV1 =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data.v1."
              + getBaseContext().getPackageName());
    corruptedZoomTables.delete();
    corruptedSavedClientParameters.delete();
    corruptedClientParametersData.delete();
    corruptedClientParametersDataV1.delete();
    hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
  }
} catch (Exception e) {

}

Kotlin

try {
    val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!sharedPreferences.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data")
        val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
        val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
        val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
        corruptedZoomTables.delete()
        corruptedSavedClientParameters.delete()
        corruptedClientParametersData.delete()
        corruptedClientParametersDataV1.delete()
        sharedPreferences.edit().putBoolean("fixed", true).apply()
    }
} catch (exception: Exception) {

}

Các cách giải quyết được cung cấp ở đây bao gồm tất cả các phiên bản và phiên bản SDK có sẵn cho Android của chúng tôi. Để làm rõ hơn (trong trường hợp bạn phát hành phiên bản trước đó của cách giải quyết không xóa nhiều tệp):

  • Các ứng dụng sử dụng SDK Android SDK v2 chỉ cần xóa một tệp: ZoomTables.data.
  • Các ứng dụng sử dụng Bản đồ Android SDK v3 beta chỉ cần xóa một tệp

    DATA_ServerControlledParameterManager.data.v1. + getBaseContext (). getPackageName ()) hoặc

    DATA_ServerControlledParameterManager.data. + getBaseContext (). getPackageName ())


1
Ứng dụng của chúng tôi hoạt động trên trình giả lập, cùng mã, nhưng không phải trên thiết bị sản xuất. Nó bắt đầu xảy ra trong khi phóng to. NGOẠI TRỪ BAN ĐẦU: androidmapsapi-ZoomTableManager
user961186

1
Lỗi là trên Android.
user961186

2
Chỉ cần kiểm tra nhiều ứng dụng sử dụng Map đang gặp sự cố, bao gồm Uber, Lyft, v.v. Google Maps dường như hoạt động với tôi, nó phải được trỏ đến một điểm cuối API khác khác với API công khai.
AlexVPerl

16
Tội ác thực sự ở đây là ngay cả khi cuộc gọi bản đồ được gói gọn trong câu lệnh thử / bắt, bằng cách nào đó, Google Maps sẽ thay thế cuộc gọi thử của bạn và làm hỏng ứng dụng thay vì ném lỗi. Bản đồ nên ném một ngoại lệ thích hợp khi nó không có sẵn, không chỉ phá vỡ mọi thứ.
Brettins

2
vấn đề tương tự ở Pakistan
Syed Raza Mehdi

44

Có vẻ trong mọi ứng dụng Google Map sẽ tạo tệp ZoomTables.data.

nhập mô tả hình ảnh ở đây

Tập tin này không đúng định dạng, phiên bản không đúng của nó có thể được tải xuống từ bình luận . Để tái tạo sự cố, hãy xóa ZoomTables.data khỏi các gói ứng dụng trên thiết bị và chèn một lỗi không đúng định dạng. Các ứng dụng sẽ sụp đổ.

Hiện tại, vấn đề đã được giải quyết ở phía google, nhưng các ứng dụng vẫn chứa phiên bản được lưu trong bộ nhớ cache của tệp dữ liệu đó. Để khắc phục sự cố, chúng ta nên xóa tệp đó ngay trên ứng dụng bắt đầu trong Phương thức ứng dụng trên ứng dụng.

private void fixGoogleMapBug() {
  try {
    SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
    if (!hasFixedGoogleBug154855417.contains("fixed")) {
      File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
      File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
      File corruptedClientParametersData =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data."
                + getBaseContext().getPackageName());
      File corruptedClientParametersDataV1 =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data.v1."
                + getBaseContext().getPackageName());
      corruptedZoomTables.delete();
      corruptedSavedClientParameters.delete();
      corruptedClientParametersData.delete();
      corruptedClientParametersDataV1.delete();
      hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
    }
  } catch (Exception e) {

  }
}

Cập nhật 1

Tôi đã cập nhật cách giải quyết, dựa trên nhận xét mới nhất của nhà phát triển google :

Các cách giải quyết được cung cấp ở đây bao gồm tất cả các phiên bản và phiên bản SDK có sẵn cho Android của chúng tôi. Để làm rõ hơn (trong trường hợp bạn phát hành phiên bản trước đó của cách giải quyết không xóa nhiều tệp):

Các ứng dụng sử dụng SDK Android SDK v2 chỉ cần xóa một tệp: ZoomTables.data. Các ứng dụng sử dụng Bản đồ Android SDK v3 beta chỉ cần xóa một tệp, DATA_ServerControlledParameterManager.data.v1. + getBaseContext (). getPackageName ()) hoặc DATA_ServerControlledParameterManager.data. + getBaseContext (). getPackageName ())


2
Không bao gồm tệp ZoomTables.data làm việc cho tôi. Cảm ơn rất nhiều! Mọi người nên sử dụng và đánh dấu là câu trả lời!
Eduardo Herzer

@ArthurAttout Vâng, tôi chứ không phải làm điều này cho bây giờ và sửa chữa các ứng dụng sản xuất của tôi có hơn 16 giờ bị rơi vì chờ đợi thêm thời gian để sửa chữa của Google
Eduardo Herzer

@EduardoHerzer ETA của Google là 48 giờ và quá trình sản xuất hoàn chỉnh sẽ mất hơn 48 giờ. (Cập nhật thời gian xem xét + thời gian ra mắt)
Muhammad Saqib

Điều này làm việc cho tôi! Tôi chỉ thay đổi một chút cho ứng dụng Flutter của mình: var dir = await getApplicationSupportDirectory (); Tệp bị hỏngZoomTables = Tệp mới (dir.path + "/ZoomTables.data");
csk

Tại sao chúng tôi xóa ZoomTables.data chỉ một lần? Điều gì xảy ra nếu điều này bị hỏng trong tương lai một lần nữa?
Jan Nepraš

11

Giải pháp này hiệu quả với tôi

  1. Lần đầu tiên mở "Thông tin ứng dụng"
  2. Chọn "Lưu trữ"
  3. Nhấp vào "Xóa dữ liệu"
  4. Mở lại ứng dụng và kiểm tra xem sự cố đã được khắc phục chưa.

    Dưới đây là những gợi ý chỉ để giúp khách hàng của bạn.

  5. Gửi email cho tất cả người dùng của bạn vì sự bất tiện này và mô tả cho họ vấn đề họ gặp phải và cung cấp cho họ các bước được đề cập ở trên để giải quyết vấn đề của họ.

  6. Bạn cũng có thể gửi Thông báo đẩy cho tất cả người dùng của mình bằng Thông báo đẩy Firebase, nếu ứng dụng của bạn có dịch vụ thông báo đẩy.

Trình diễn ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


6

Đối với Android, nhiều nhà phát triển đã đề cập đến một cách giải quyết bao gồm xóa tệp ZoomTable.data trực tiếp khỏi ứng dụng của họ. Sau khi xem xét, sửa lỗi này có vẻ an toàn và bạn có thể thử nó trong ứng dụng của mình.

Vui lòng tham khảo https://issuetracker.google.com/154855417#comment179

Nếu bạn muốn người dùng tiếp tục sử dụng ứng dụng của mình mà không cần cài đặt lại, Mã mẫu được sao chép ở đây để thuận tiện cho bạn. Trong Application.onCreate () :

SharedPreferences googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
if (!googleBug.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
}

tham khảo: SDK Google Maps bị lỗi - đã giải quyết một phần



6

Hạn chế của các giải pháp trên:

  • ZoomTables.data bị xóa trên mọi thiết bị, bất kể thiết bị có bị ảnh hưởng bởi sự cố hay không
  • Cách giải quyết chỉ hoạt động một lần, có chắc chắn rằng vấn đề này không bao giờ xảy ra nữa không?

Hạn chế của giải pháp của tôi:

  • trong lần thực hiện đầu tiên của hoạt động bản đồ trên bản đồ thiết bị bị ảnh hưởng là trống rỗng. Sau khi xoay thiết bị hoặc bản đồ thực hiện thứ hai được hiển thị

Giải pháp của tôi bắt được Ngoại lệ được ném bởi SDK Maps, gọi đây là onCreate của lớp Ứng dụng:

public static void catchGoogleMapsException(final Context context)
{
  final Thread.UncaughtExceptionHandler defaultHandler =
    Thread.getDefaultUncaughtExceptionHandler();
  Thread.setDefaultUncaughtExceptionHandler(
    (@NonNull final Thread thread, @NonNull final Throwable ex) ->
    {
      if (thread.getName().contains("ZoomTableManager"))
      {
        new File(context.getFilesDir(), "ZoomTables.data").delete();
        Log.w("Maps Bug 154855417", "Caught exception and deleted ZoomTables.data");
      }
      else
        if (defaultHandler!=null)
          defaultHandler.uncaughtException(thread, ex);
        else
          throw new RuntimeException(
            "No default uncaught exception handler.", ex);
    });
}

Tôi vừa đẩy ra một cách giải quyết tương tự. Vì tôi có các nguồn ánh xạ thay thế cho Google trong Ứng dụng của mình, tôi thay đổi nguồn mặc định không phải là Google cũng như cung cấp cho người dùng một thông báo giải thích những gì đã được thực hiện. Hy vọng nó sẽ giữ cho tôi an toàn nếu Google quản lý để làm điều gì đó tương tự trong tương lai. Tôi hy vọng có thử nghiệm để cải thiện mặc dù.
Ifor

Tôi đã phải xóa bộ nhớ để giải quyết vấn đề này. Vì bất kỳ lý do gì, xóa ZoomTables.data không đủ để giải quyết vấn đề này cho tôi. Tôi đã xóa trong hoạt động khởi động của tôi trênCreate (). Tôi đoán tôi nên xem xét phạm vi ứng dụng Exception Handler.
ShellDude

3

Chúng tôi tin rằng nguyên nhân gốc rễ của sự cố SDK Google Maps đã được khắc phục. Bản sửa lỗi đang được phổ biến đến các ứng dụng bị ảnh hưởng và nó đang tiếp tục hướng tới độ phân giải ở tốc độ dự kiến. Nghị quyết đầy đủ dự kiến ​​sẽ hoàn thành vào Thứ Năm, 2020-04-23 19:45 US / Pacific.

Phiên bản sản xuất đã được sửa (về phía google) nhưng nếu bạn vẫn gặp sự cố với trình giả lập, bạn chỉ phải chạy mã sau đây một lần.

ChínhActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    fixGoogleMapBugTemp()   //TODO: Then clean this line

//  ...  

}

/**
 * Observation: Invoke this method only once
 */
private fun fixGoogleMapBugTemp() {
    val googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!googleBug.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
    }
}

Giải pháp thay thế : Xóa dữ liệu ứng dụng (không chỉ bộ đệm).

Lưu ý : Một bản sao của tệp có vấn đề từ các gói ứng dụng trên thiết bị nếu có ai cần nó để repro.

Khối

Nguồn

GL


3

Câu trả lời đầy đủ và chính thức cho tất cả:

Chẩn đoán: Sự cố của SDK di động Nền tảng Google Maps (iOS và Android) khi tải.

Giải pháp thay thế: * Xóa dữ liệu của ứng dụng bị ảnh hưởng (không chỉ bộ đệm) hoặc gỡ cài đặt sau đó cài đặt lại (các) ứng dụng bị ảnh hưởng.

  • Mã giải pháp cho iOS:

Vị trí được đề xuất cho mã là trước khi khởi tạo GMSService trong ứng dụng (_: didFinishLaunchingWithOptions :) (Swift) hoặc ứng dụng: didFinishLaunchingWithOptions: (Objective-C). Đặc biệt:

Nhanh:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Mục tiêu-C:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL]);
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Khi bạn đã triển khai ứng dụng này trong ứng dụng của mình, bạn có thể gửi trường hợp Hỗ trợ Bản đồ nếu bạn muốn chúng tôi giúp tiến hành phê duyệt. Vui lòng đảm bảo bao gồm ID ứng dụng, ID gói và phiên bản bạn muốn được xem xét trong trường hợp của bạn.

  • Mã giải pháp cho Android:

    Vị trí được đề xuất cho mã là trong Application.onCreate ():

    Java

    try {
      SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
      if (!hasFixedGoogleBug154855417.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
        File corruptedClientParametersData =
            new File(
              getFilesDir(),
              "DATA_ServerControlledParametersManager.data.v1."
                  + getBaseContext().getPackageName());
        corruptedZoomTables.delete();
        corruptedSavedClientParameters.delete();
        corruptedClientParametersData.delete();
        hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
      }
    } catch (Exception e) {
    
    }

    Kotlin

    try {
        val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
        if (!sharedPreferences.contains("fixed")) {
            val corruptedZoomTables = File(filesDir, "ZoomTables.data")
            val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
            val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
            corruptedZoomTables.delete()
            corruptedSavedClientParameters.delete()
            corruptedClientParametersData.delete()
            sharedPreferences.edit().putBoolean("fixed", true).apply()
        }
    } catch (exception: Exception) {
    
    }

Nguồn: https://issuetracker.google.com/issues/1548554


2

Đây là mã làm việc cho Xamarin. Bạn cần cài đặt gói nuget Xamarin.Essentials.

if (!Preferences.Get("google_bug_fixed", false))
{
    var corruptedZoomTables = new File(FileSystem.AppDataDirectory, "ZoomTables.data");
    corruptedZoomTables.Delete();
    Preferences.Set("google_bug_fixed", true);
}

1
Không nên đọc dòng cuối cùng Tùy
chọn.SET

1
Bạn nói đúng. Tôi sửa nó rồi.
Jan Nepraš

1

Bạn nên gọi phương thức theo dõi trên onCreate của ứng dụng Android để tránh sự cố.

private fun clearCorruptedGMapsPreference() {
        try {
            val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
            if (!sharedPreferences.contains("fixed")) {
                val corruptedZoomTables = File(filesDir, "ZoomTables.data")
                val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
                val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
                val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
                corruptedZoomTables.delete()
                corruptedSavedClientParameters.delete()
                corruptedClientParametersData.delete()
                corruptedClientParametersDataV1.delete()
                sharedPreferences.edit().putBoolean("fixed", true).apply()
            }
        } catch (exception: Exception) {
            LogUtil.e(this@CourierApplication::class.java.name, "An error has happened. Error: ".plus(exception.cause?.message
                    ?: ""))
        }
    }
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.