在 MainActivity.onCreate() 中調用 SDKInitializer.initialize(getApplicationContext()) 導致崩潰,或提示「未授權」、「初始化失敗」。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 核心:在這裡初始化,傳入 Application Context
SDKInitializer.initialize(this); // this 即 Application Context
// 可選:開啟日誌調試
// SDKInitializer.setLogEnable(true);
}
}
<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>
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();
}
}
jniLibs 下包含 armeabi-v7a, arm64-v8a 等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 設置通常能解決剩餘問題。