AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ZoomTableManager


134

แอพของฉันที่ใช้ Google Maps SDK (v2) เพิ่งเริ่มทำงานล้มเหลวด้วยข้อยกเว้นนี้:

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)

ใน SDK v3 เบต้าการติดตามสแต็กคือ:

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)

สาเหตุคืออะไร?


10
อาจเป็นปัญหาของ Google Maps
Eduardo Herzer

1
นี่เป็นแอปที่ใช้งานจริงหรือเป็นเพียงการทดสอบหรือไม่
user961186

18
หมายเหตุ: อย่าโพสต์คำตอบ "ฉันด้วย" สำหรับคำถามนี้ เฉพาะคำตอบที่ตอบคำถามเท่านั้นที่ควรโพสต์เป็นคำตอบ
Wai Ha Lee

3
อัปเดตจะอยู่ที่นี่: issuetracker.google.com/issues/154855417
lewkka

2
@ MidnightGuest หากคุณขยายไปเล็กน้อยนั่นอาจทำให้เป็นคำถามที่ดี
Makyen

คำตอบ:


83

แก้ไข : ต่อไปนี้เป็นวิธีแก้ปัญหาอย่างเป็นทางการจาก Google ( ลิงก์ )

สรุป

เธรดของ Google Maps SDK ขัดข้องแอป (ArrayIndexOutOfBoundsException) - โซลูชันที่นำเสนอ

ลักษณะ

ในวันที่ 23 เมษายน 2020 เริ่มต้นเวลา 11:30 น. PDT Google ให้บริการอัปเดตการกำหนดค่าของอุปกรณ์มือถือแผนที่เป็นเวลา 4 ชั่วโมงซึ่งจะทำให้เกิดข้อขัดข้องใน Maps SDK สำหรับ Android และ iOS แอปพลิเคชันบนอุปกรณ์ที่ดาวน์โหลดการกำหนดค่าเวอร์ชันนี้ (ในช่วงที่ไฟดับ) มีความเสี่ยงที่จะเกิดความผิดพลาด วิธีแก้ปัญหามีให้สำหรับ Maps SDK สำหรับ Android และ iOS

Maps SDK สำหรับ Android

Maps SDK สำหรับ Android v2 (รวมอยู่ในบริการ Google Play)

อัปเดตของ Google Play Services เพื่อแก้ไขข้อขัดข้องได้รับการเผยแพร่ไปยังอุปกรณ์ทั้งหมดด้วย Google Play Services เวอร์ชัน 17.4.55 และใหม่กว่า ไม่มีการเปลี่ยนแปลงหมายเลขเวอร์ชันของ Google Play Services บนอุปกรณ์หลังจากติดตั้งการอัปเดต ไม่จำเป็นต้องดำเนินการใด ๆ จากผู้พัฒนาหรือผู้ใช้ปลายทางเพื่อรับโมดูลแผนที่ที่อัปเดตแล้ว อย่างไรก็ตามผู้พัฒนาสามารถตรวจสอบว่าโมดูลนั้นมีอยู่ในอุปกรณ์ที่กำหนดด้วยคำสั่ง adb ต่อไปนี้:

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

คุณควรเห็นบรรทัดที่Module Set ID: mapsแสดงรายการในModule Setsส่วน

Module Set ID: maps, Module Set Version: 2015120015120000

อัตราความผิดพลาดของ Maps SDK สำหรับ Android v2 กลับมาเป็นปกติ

ณ ตอนนี้หากคุณยังไม่ได้อัปเดตแอปของคุณด้วยการแก้ไขปัญหาโค้ดฝั่งไคลเอ็นต์ที่กล่าวถึงด้านล่างคุณไม่จำเป็นต้องดำเนินการใด ๆ เพิ่มเติม

หากคุณได้อัปเดตแอปของคุณด้วยวิธีแก้ไขปัญหาแล้วคุณสามารถลบวิธีแก้ปัญหาในการอัปเดตแอปของคุณในภายหลัง (แต่การทำให้วิธีแก้ไขนั้นปลอดภัย)

Premium Plan Maps SDK สำหรับ Android v2 หรือ Maps SDK สำหรับ Android v3 beta (ห้องสมุดคงที่)

หากแอปของคุณใช้ Premium Plan Maps SDK สำหรับ Android v2 หรือ Maps SDK สำหรับ Android v3 เบต้า (ไลบรารีคงที่) และยังคงประสบปัญหาขัดข้องเรายังคงแนะนำให้คุณแนะนำวิธีแก้ไขปัญหาด้านล่างผ่านการอัปเดตแอปของคุณ เนื่องจากแอปพลิเคชันของคุณกำลังโหลด SDK แบบคงที่ซึ่งมีความเสี่ยงต่อข้อมูลที่ไม่ดีที่ถูกเก็บไว้ในอุปกรณ์บางอย่างเฉพาะการอัปเดตแอปพลิเคชันของคุณเท่านั้นที่สามารถแก้ปัญหาได้

อนุมัติการตรวจสอบ Play Store

หากคุณอัปเดตแอป แต่ประสบการณ์เล่นรีวิวร้านอนุมัติความล่าช้าของคุณโปรดยื่นกรณีการสนับสนุนกับ app ของแพคเกจ ID: ⁠ ติดต่อทีมสนับสนุน ทีมสนับสนุนของเราจะเพิ่มคำขอของคุณภายในและเร่งการอนุมัติ

ความเห็นเชิงลบใน Google Play Store

นักพัฒนาแอปพลิเคชั่นบางคนสอบถามเกี่ยวกับบทวิจารณ์ระดับ 1 ดาวใน Google Play Store จากผู้ใช้ปลายทางเนื่องจากข้อขัดข้อง สามารถลบเฉพาะความคิดเห็นที่ละเมิดนโยบายของ Google Play [1] คุณสามารถตั้งค่าสถานะบทวิจารณ์ที่ไม่เหมาะสมได้ใน Play Console [2] แอปพลิเคชันจะไม่ถูกลบโดยอัตโนมัติจากร้านค้า Google Play เนื่องจากความคิดเห็นเชิงลบ นอกจากนี้ยังเป็นที่น่าสังเกตว่าการคำนวณคะแนนรีวิวแอปโดยรวมของคุณนั้นเป็นความเห็นล่าสุดซึ่งหมายความว่าคะแนนของคุณจะกลับคืนสู่ระดับก่อนเกิดเหตุการณ์เมื่อเวลาผ่านไป

[1] ⁠การให้คะแนน & รีวิวบน Play Store

[2] ⁠ รายงานความเห็นที่ไม่เหมาะสม

Maps SDK สำหรับ iOS

อัตราการขัดข้องบน iOS กลับสู่ปกติ หากแอปพลิเคชันของคุณยังคงประสบปัญหาคุณต้องอัปเดตและเผยแพร่แอปของคุณด้วยรหัสการแก้ไขปัญหาที่สื่อสารที่นี่

สำหรับคำถามเกี่ยวกับการปรับใช้หรือเร่งแอปพลิเคชันของคุณใน Apple App Store โปรดติดต่อ Apple โดยตรง


ด้วยการอัปเดตนี้เรากำลังปิดปัญหานี้ ขอบคุณทุกคนสำหรับความอดทนของคุณ ทีมของเรากำลังดำเนินการตรวจสอบภายในเชิงลึกเกี่ยวกับเหตุการณ์นี้ เราจะเผยแพร่การวิเคราะห์ของเราโดยเร็วที่สุด (ประมาณหนึ่งสัปดาห์) ในขณะเดียวกันถ้าคุณมีคำถามใด ๆ หรือยังคงประสบปัญหาโปรด⁠ ยื่นกรณีการสนับสนุน

วิธีการแก้ปัญหา:

  • ผู้ใช้ปลายทางบน Android สามารถล้างข้อมูลแอพที่ได้รับผลกระทบ (ไม่ใช่แค่แคช)

  • ผู้ใช้ปลายทางบน iOS สามารถถอนการติดตั้งจากนั้นติดตั้งแอปที่ได้รับผลกระทบอีกครั้ง

  • นักพัฒนาแอปสามารถใช้การแก้ไขปัญหาโค้ดด้านล่างเพื่อแก้ปัญหาสำหรับผู้ใช้ปลายทางทั้งหมด

วิธีแก้ไขรหัสสำหรับ iOS:

ตำแหน่งที่แนะนำสำหรับรหัสคือก่อนการเริ่มต้น GMSServices ในแอปพลิเคชัน (_: didFinishLaunchingWithOptions :) (Swift) หรือแอปพลิเคชัน: วิธีการ DidFinishLaunchingWithOptions: (Objective-C) โดยเฉพาะ:

สวิฟท์:

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)
}

Objective-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];
}

การแก้ปัญหาโค้ดสำหรับ Android:

ตำแหน่งที่แนะนำสำหรับรหัสอยู่ใน Application.onCreate ():

ชวา

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) {

}

วิธีแก้ไขปัญหาที่ให้ไว้ที่นี่ครอบคลุมถึงรสชาติและเวอร์ชั่นทั้งหมดของ SDK สำหรับ Android ของเรา หากต้องการชี้แจงเพิ่มเติม (ในกรณีที่คุณเปิดตัววิธีแก้ไขปัญหารุ่นก่อนหน้าซึ่งไม่ได้ลบไฟล์หลายไฟล์)

  • แอปพลิเคชันที่ใช้ Maps Android SDK v2 ควรจะลบไฟล์เดียว: ZoomTables.data
  • แอปพลิเคชันที่ใช้ Maps Android SDK v3 รุ่นเบต้าควรจะลบไฟล์เดียวเท่านั้น

    DATA_ServerControlledParametersManager.data.v1 + getBaseContext (). getPackageName ()) หรือ

    DATA_ServerControlledParametersManager.data + getBaseContext (). getPackageName ())


1
แอพของเราทำงานบนอีมูเลเตอร์, รหัสเดียวกัน แต่ไม่สามารถใช้กับอุปกรณ์การผลิตได้ มันเริ่มเกิดขึ้นขณะซูม ข้อยกเว้นของ FATAL: androidmapsapi-ZoomTableManager
user961186

1
ข้อผิดพลาดเกิดขึ้นบน Android
user961186

2
เพิ่งตรวจสอบแอปจำนวนมากที่ใช้แผนที่ล่มแล้วรวมถึง Uber, Lyft และอื่น ๆ ดูเหมือนว่า Google แผนที่จะใช้งานได้สำหรับฉันมันจะต้องชี้ไปยังจุดสิ้นสุด API อื่นที่แตกต่างจาก API สาธารณะ
AlexVPerl

16
อาชญากรรมที่แท้จริงที่นี่คือแม้เมื่อการโทรแผนที่ถูกห่อหุ้มในคำสั่งลอง / จับ Google Maps จะทำการเรียกการลองของคุณและทำให้แอปหยุดทำงานแทนที่จะเป็นข้อผิดพลาด แผนที่ควรมีข้อยกเว้นที่เหมาะสมเมื่อไม่พร้อมใช้งานไม่ใช่เพียง แต่ทำทุกอย่างผิดพลาด
Brett

2
ปัญหาเดียวกันในปากีสถาน
Syed Raza Mehdi

44

ดูเหมือนในทุกแอป Google Map สร้างไฟล์ ZoomTables.data

ป้อนคำอธิบายรูปภาพที่นี่

ไฟล์นี้ถูกผิดรูปแบบรุ่นในรูปแบบของมันที่สามารถดาวน์โหลดได้จากการแสดงความคิดเห็น ในการทำให้เกิดปัญหาอีกครั้งให้เอา ZoomTables.data ออกจากแพ็คเกจแอปบนอุปกรณ์และใส่อันที่ไม่ถูกต้อง แอปควรมีปัญหา

ขณะนี้ปัญหาได้รับการแก้ไขในด้านของ Google แต่แอปยังคงมีไฟล์ข้อมูลในเวอร์ชันแคช เพื่อแก้ไขปัญหาเราควรลบไฟล์นั้นในแอพเริ่มต้นใน Application onCreate Method

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) {

  }
}

อัปเดต 1

ฉันได้รับการอัปเดตการแก้ปัญหาโดยอ้างอิงจากความคิดเห็นล่าสุดของนักพัฒนา Google :

วิธีแก้ไขปัญหาที่ให้ไว้ที่นี่ครอบคลุมถึงรสชาติและเวอร์ชั่นทั้งหมดของ SDK สำหรับ Android ของเรา หากต้องการชี้แจงเพิ่มเติม (ในกรณีที่คุณเปิดตัววิธีแก้ไขปัญหารุ่นก่อนหน้าซึ่งไม่ได้ลบไฟล์หลายไฟล์)

แอปพลิเคชันที่ใช้ Maps Android SDK v2 ควรจะลบไฟล์เดียว: ZoomTables.data แอปพลิเคชันที่ใช้ Maps Android SDK v3 รุ่นเบต้าควรจะลบไฟล์เพียงไฟล์เดียวนั่นคือ DATA_ServerControlledParametersManager.data.v1 + getBaseContext (). getPackageName ()) หรือ DATA_ServerControlledParametersManager.data + getBaseContext (). getPackageName ())


2
การยกเว้นไฟล์ ZoomTables.data ใช้งานได้สำหรับฉัน ขอบคุณมาก! ทุกคนควรใช้สิ่งนี้และทำเครื่องหมายว่าเป็นคำตอบ!
Eduardo Herzer

@ArthurAttout ใช่ฉันต้องการทำเช่นนี้ในตอนนี้และแก้ไขแอปที่ใช้งานจริงของฉันซึ่งทำงานมากกว่า 16 ชั่วโมงทำงานล้มเหลวกว่ารอเวลาแก้ไข Google มากกว่า
Eduardo Herzer

@EduardoHerzer ETA ของ Google เป็นเวลา 48 ชั่วโมงและการผลิตแบบเต็มจะใช้เวลามากกว่า 48 ชั่วโมง (อัปเดตเวลาตรวจสอบ + เวลาเปิดตัว)
มูฮัมหมัด Saqib

สิ่งนี้ได้ผลสำหรับฉัน! ฉันเปลี่ยนเพียงเล็กน้อยสำหรับแอพพลิเคชั่น Flutter ของฉัน: var dir = รอ getApplicationSupportDirectory (); ไฟล์ที่เสียหายZoomTables = ไฟล์ใหม่ (dir.path + "/ZoomTables.data");
csk

เหตุใดเราจึงลบ ZoomTables.data เพียงครั้งเดียว จะเกิดอะไรขึ้นถ้าสิ่งนี้ได้รับความเสียหายในอนาคตอีกครั้ง
Jan Nepraš

11

วิธีนี้ใช้ได้ผลสำหรับฉัน

  1. เปิดครั้งแรก "ข้อมูลแอป"
  2. เลือก "ที่เก็บข้อมูล"
  3. คลิก "ล้างข้อมูล"
  4. เปิดแอปอีกครั้งและตรวจสอบว่าปัญหาได้รับการแก้ไขหรือไม่

    ด้านล่างนี้เป็นคำแนะนำเพียงเพื่อช่วยลูกค้าของคุณ

  5. ส่งอีเมลถึงผู้ใช้ทั้งหมดของคุณเพื่อความไม่สะดวกและอธิบายปัญหาที่พวกเขาเผชิญและให้ขั้นตอนดังกล่าวข้างต้นเพื่อแก้ไขปัญหาของพวกเขา

  6. นอกจากนี้คุณยังสามารถส่งการแจ้งเตือนแบบพุชไปยังผู้ใช้ทั้งหมดของคุณด้วย Firebase Push Notifications หากแอปของคุณมีบริการการแจ้งเตือนแบบพุช

ภาพหน้าจอสาธิต:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


6

สำหรับ Android นักพัฒนาหลายคนกล่าวถึงวิธีแก้ปัญหาซึ่งประกอบด้วยการลบไฟล์ ZoomTable.data โดยตรงจากแอปพลิเคชันของพวกเขา หลังจากตรวจทานแล้วการแก้ไขนี้ดูปลอดภัยและคุณสามารถลองได้ในแอปพลิเคชันของคุณ

โปรดอ้างอิง https://issuetracker.google.com/154855417#comment179

หากคุณต้องการให้ผู้ใช้ของคุณใช้งานแอปต่อไปโดยไม่ต้องทำการติดตั้งใหม่โค้ดตัวอย่างจะถูกคัดลอกวางที่นี่เพื่อความสะดวกของคุณ ใน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();
}

การอ้างอิง: SDK ของ Google Maps หยุดทำงาน - ได้รับการแก้ไขบางส่วน



6

ข้อเสียของการแก้ปัญหาข้างต้น:

  • ZoomTables.data จะถูกลบในทุกอุปกรณ์โดยไม่คำนึงว่าอุปกรณ์ได้รับผลกระทบจากความผิดพลาดหรือไม่
  • วิธีแก้ปัญหาใช้งานได้เพียงครั้งเดียวเท่านั้นแน่ใจหรือไม่ว่าปัญหานี้จะไม่เกิดขึ้นอีก

ข้อเสียของการแก้ปัญหาของฉัน:

  • ในการดำเนินการกิจกรรมแผนที่ครั้งแรกบนแผนที่อุปกรณ์ที่ได้รับผลกระทบว่างเปล่า หลังจากการหมุนของอุปกรณ์หรือแผนที่การดำเนินการที่สองจะปรากฏขึ้น

โซลูชันของฉันจับข้อยกเว้นที่เกิดจาก Maps SDK เรียกสิ่งนี้ใน onCreate ของคลาส Application:

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);
    });
}

ฉันเพิ่งผลักวิธีแก้ปัญหาที่คล้ายกันออกมา เนื่องจากฉันมีแหล่งทำแผนที่สำรองให้กับ Google ในแอพของฉันฉันเปลี่ยนแหล่งข้อมูลเริ่มต้นว่าไม่ใช่ Google และให้ข้อความอธิบายสิ่งที่ได้ทำไปแล้วแก่ผู้ใช้ หวังว่ามันจะทำให้ฉันปลอดภัยถ้า Google จัดการเพื่อทำสิ่งที่คล้ายกันในอนาคต ฉันคาดหวังว่าจะมีการทดสอบเพื่อปรับปรุง
Ifor

ฉันต้องล้างที่เก็บข้อมูลเพื่อแก้ไขปัญหานี้ ไม่ว่าจะด้วยเหตุผลใดก็ตามการลบ ZoomTables.data ไม่เพียงพอที่จะแก้ไขปัญหานี้สำหรับฉัน ฉันลบในกิจกรรมเริ่มต้นของฉันในสร้าง () ฉันเดาว่าฉันควรมองเข้าไปในขอบเขต Application Exception Handler
ShellDude

3

เราเชื่อว่าสาเหตุของการล่มของ Google Maps SDK ได้รับการแก้ไขแล้ว การแก้ไขกำลังถูกแพร่กระจายไปยังแอปพลิเคชันที่ได้รับผลกระทบและกำลังดำเนินการไปสู่การแก้ปัญหาตามที่คาดไว้ ความละเอียดเต็มรูปแบบคาดว่าจะเสร็จสมบูรณ์ในวันพฤหัสบดีที่ 2020-04-23 19:45 สหรัฐ / แปซิฟิก

รุ่นที่ได้รับการแก้ไขได้รับการแก้ไข (ด้าน Google) แต่ถ้าคุณยังคงมีปัญหากับโปรแกรมจำลองของคุณคุณต้องเรียกใช้รหัสต่อไปนี้เพียงครั้งเดียว

MainActivity.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();
    }
}

วิธีแก้ปัญหา : ล้างข้อมูลแอปพลิเคชัน (ไม่ใช่เฉพาะแคช)

หมายเหตุ : สำเนาของไฟล์ที่มีปัญหาจากแอปแพ็กเกจบนอุปกรณ์หากใครก็ตามต้องการมันเพื่อทำซ้ำ

บล็อก

แหล่ง

GL


3

คำตอบที่สมบูรณ์และเป็นทางการสำหรับทุกคน:

การวินิจฉัย: ความผิดพลาดของ SDK มือถือแพลตฟอร์ม Google Maps (iOS และ Android) ที่โหลด

วิธีแก้ปัญหา: * ล้างข้อมูลแอปที่ได้รับผลกระทบ (ไม่ใช่เฉพาะแคช) หรือถอนการติดตั้งจากนั้นติดตั้งแอปที่ได้รับผลกระทบใหม่

  • วิธีแก้ไขรหัสสำหรับ iOS:

ตำแหน่งที่แนะนำสำหรับรหัสคือก่อนการเริ่มต้น GMSServices ในแอปพลิเคชัน (_: didFinishLaunchingWithOptions :) (Swift) หรือแอปพลิเคชัน: วิธีการ DidFinishLaunchingWithOptions: (Objective-C) โดยเฉพาะ:

สวิฟท์:

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)
}

Objective-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];
}

เมื่อคุณปรับใช้ในแอปของคุณแล้วคุณสามารถยื่นกรณีการสนับสนุน Maps หากคุณต้องการให้เราช่วยเร่งการอนุมัติ โปรดตรวจสอบให้แน่ใจว่าได้ระบุ ID แอปพลิเคชันของคุณ Bundle ID และเวอร์ชันที่คุณต้องการตรวจสอบในกรณีของคุณ

  • การแก้ปัญหาโค้ดสำหรับ Android:

    ตำแหน่งที่แนะนำสำหรับรหัสอยู่ใน Application.onCreate ():

    ชวา

    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) {
    
    }

ที่มา: https://issuetracker.google.com/issues/1548554


2

นี่คือรหัสที่ใช้งานได้สำหรับ Xamarin คุณต้องติดตั้ง Xamarin แพคเกจ nuget ที่จำเป็น

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

1
บรรทัดสุดท้ายไม่ควรอ่าน Preferences.SET (.....
AndyM

1
คุณถูก. ฉันซ่อมมัน.
Jan Nepraš

1

คุณควรเรียกวิธีการติดตามบน onCreate ของแอพ Android ของคุณเพื่อหลีกเลี่ยงความผิดพลาด

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
                    ?: ""))
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.