首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 百度地圖 SDK 初始化失敗:Application 中初始化的正確姿勢

     編輯:程式設計疑難解答

常見錯誤場景

在 MainActivity.onCreate() 中調用 SDKInitializer.initialize(getApplicationContext()) 導致崩潰,或提示「未授權」、「初始化失敗」。

根本原因

  • 百度地圖 SDK 要求在 Application 子類的 onCreate() 中初始化
  • 確保進程啟動時就完成初始化,無論從哪個組件啟動 (Activity/Service/BroadcastReceiver)
  • 避免多進程重複初始化問題

正確實現步驟

1. 創建 Application 子類

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 核心:在這裡初始化,傳入 Application Context
        SDKInitializer.initialize(this);  // this 即 Application Context
        
        // 可選:開啟日誌調試
        // SDKInitializer.setLogEnable(true);
    }
}

2. AndroidManifest.xml 註冊

<application
    android:name=".MyApplication"  <!-- 關鍵:指定自定義 Application -->
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    
    <!-- 百度地圖 AK 配置 -->
    <meta-data
        android:name="com.baidu.lbsapi.API_KEY"
        android:value="您的AK" />
        
    <activity android:name=".MainActivity">...</activity>
</application>

3. MainActivity 中直接使用

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 無需再次初始化,直接使用 MapView 等組件
        MapView mapView = findViewById(R.id.mapView);
        BaiduMap baiduMap = mapView.getMap();
        // ...
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }
}

常見坑點排查清單

  1. AK 申請:包名、SHA1 指紋必須與簽名一致 (Debug/Release 分開)
  2. 權限聲明:網絡、定位、存儲權限在 Manifest 中聲明
  3. so 库架構:jniLibs 下包含 armeabi-v7a, arm64-v8a 等
  4. 多進程:若有 `:remote` 進程,Application onCreate 會執行多次,需加進程判斷
  5. 版本兼容:SDK 版本與 Android 版本兼容性

進程判斷示例 (多進程項目)

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 僅主進程初始化
        if (getApplicationInfo().packageName.equals(getProcessName())) {
            SDKInitializer.initialize(this);
        }
    }
    
    private String getProcessName() {
        int pid = android.os.Process.myPid();
        ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo info : am.getRunningAppProcesses()) {
            if (info.pid == pid) return info.processName;
        }
        return "";
    }
}

總結

百度地圖 SDK **必須在 Application.onCreate() 中初始化**,傳入 Application Context。這是官方文檔強制要求,也是避免 90% 初始化崩潰的關鍵。對照官方 Demo 檢查 Manifest 配置和 AK 設置通常能解決剩餘問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved