├── .gitignore ├── README.md ├── apk ├── 1477562406.png └── AmapAndGoogle.apk ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── amap │ │ └── com │ │ └── amapandgoogle │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── Google Play services.apk │ │ └── Google Play.apk │ ├── java │ │ └── amap │ │ │ └── com │ │ │ └── amapandgoogle │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── amap │ └── com │ └── amapandgoogle │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | /.idea 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # android-switch-map 2 | 高德地图和Google地图切换 3 | 4 | ## 前述 ## 5 | - [高德官网申请Key](http://lbs.amap.com/dev/#/). 6 | - 阅读[参考手册](http://a.amap.com/lbs/static/unzip/Android_Map_Doc/index.html). 7 | - 工程基于Android 3D地图SDK实现 8 | - 实现Google地图展示还需要申请Google Key,手机安装Google框架服务。 9 | 10 | ## 扫一扫安装## 11 | ![Screenshot]( https://raw.githubusercontent.com/amap-demo/android-switch-map/master/apk/1477562406.png) 12 | 13 | ## 使用方法## 14 | ### 1:配置搭建AndroidSDK工程 ### 15 | - [Android Studio工程搭建方法](http://lbs.amap.com/api/android-sdk/guide/creat-project/android-studio-creat-project/#add-jars). 16 | - [通过maven库引入SDK方法](http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=18786). 17 | -------------------------------------------------------------------------------- /apk/1477562406.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amap-demo/android-switch-map/191589be8c924987f3e46b57704cf970147fa180/apk/1477562406.png -------------------------------------------------------------------------------- /apk/AmapAndGoogle.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amap-demo/android-switch-map/191589be8c924987f3e46b57704cf970147fa180/apk/AmapAndGoogle.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | defaultConfig { 7 | ndk { 8 | abiFilters 'armeabi' 9 | abiFilters 'armeabi-v7a' 10 | } 11 | applicationId "amap.com.amapandgoogle" 12 | minSdkVersion 12 13 | targetSdkVersion 26 14 | versionCode 1 15 | versionName "1.0" 16 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 17 | } 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | } 25 | 26 | dependencies { 27 | compile fileTree(dir: 'libs', include: ['*.jar']) 28 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 29 | exclude group: 'com.android.support', module: 'support-annotations' 30 | }) 31 | compile 'com.android.support:appcompat-v7:23.4.0' 32 | testCompile 'junit:junit:4.12' 33 | compile 'com.amap.api:3dmap:latest.integration' 34 | compile 'com.google.android.gms:play-services-maps:9.4.0' 35 | compile 'com.amap.api:location:latest.integration' 36 | } 37 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in E:\Software\android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/amap/com/amapandgoogle/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package amap.com.amapandgoogle; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("amap.com.amapandgoogle", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 24 | 27 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/assets/Google Play services.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amap-demo/android-switch-map/191589be8c924987f3e46b57704cf970147fa180/app/src/main/assets/Google Play services.apk -------------------------------------------------------------------------------- /app/src/main/assets/Google Play.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amap-demo/android-switch-map/191589be8c924987f3e46b57704cf970147fa180/app/src/main/assets/Google Play.apk -------------------------------------------------------------------------------- /app/src/main/java/amap/com/amapandgoogle/MainActivity.java: -------------------------------------------------------------------------------- 1 | package amap.com.amapandgoogle; 2 | 3 | import android.animation.Animator; 4 | import android.animation.AnimatorListenerAdapter; 5 | import android.app.AlertDialog; 6 | import android.content.BroadcastReceiver; 7 | import android.content.Context; 8 | import android.content.DialogInterface; 9 | import android.content.Intent; 10 | import android.content.IntentFilter; 11 | import android.net.ConnectivityManager; 12 | import android.net.Uri; 13 | import android.os.Bundle; 14 | import android.os.Environment; 15 | import android.os.Handler; 16 | import android.os.Message; 17 | import android.support.v4.app.FragmentActivity; 18 | import android.util.Log; 19 | import android.view.View; 20 | import android.view.animation.AlphaAnimation; 21 | import android.widget.Button; 22 | import android.widget.CompoundButton; 23 | import android.widget.LinearLayout; 24 | import android.widget.LinearLayout.LayoutParams; 25 | import android.widget.Toast; 26 | import android.widget.ToggleButton; 27 | 28 | import com.amap.api.location.AMapLocation; 29 | import com.amap.api.location.AMapLocationClient; 30 | import com.amap.api.location.AMapLocationClientOption; 31 | import com.amap.api.location.AMapLocationListener; 32 | import com.amap.api.maps.AMap; 33 | import com.amap.api.maps.AMapOptions; 34 | import com.amap.api.maps.CameraUpdateFactory; 35 | import com.amap.api.maps.TextureMapView; 36 | import com.amap.api.maps.model.LatLng; 37 | import com.google.android.gms.common.ConnectionResult; 38 | import com.google.android.gms.common.GooglePlayServicesUtil; 39 | import com.google.android.gms.maps.GoogleMap; 40 | import com.google.android.gms.maps.GoogleMapOptions; 41 | import com.google.android.gms.maps.MapView; 42 | import com.google.android.gms.maps.MapsInitializer; 43 | import com.google.android.gms.maps.OnMapReadyCallback; 44 | import com.google.android.gms.maps.model.CameraPosition; 45 | 46 | import java.io.File; 47 | import java.io.FileOutputStream; 48 | import java.io.IOException; 49 | import java.io.InputStream; 50 | 51 | public class MainActivity extends FragmentActivity implements View.OnClickListener, 52 | AMap.OnCameraChangeListener, OnMapReadyCallback, GoogleMap.OnCameraMoveListener, 53 | AMapLocationListener, CompoundButton.OnCheckedChangeListener{ 54 | private ToggleButton mcheckbtn; 55 | private Button mapbtn; 56 | private LinearLayout mContainerLayout; 57 | private LayoutParams mParams; 58 | private TextureMapView mAmapView; 59 | private MapView mGoogleMapView; 60 | private float zoom = 10; 61 | private double latitude = 39.23242 ; 62 | private double longitude = 116.253654; 63 | private boolean mIsAmapDisplay = true; 64 | private boolean mIsAuto = true; 65 | private GoogleMap googlemap; 66 | private AMapLocationClient mlocationClient; 67 | private AMapLocationClientOption mLocationOption; 68 | private AlphaAnimation anappear; 69 | private AlphaAnimation andisappear; 70 | private IntentFilter mIntentFilter; 71 | @Override 72 | protected void onCreate(Bundle savedInstanceState) { 73 | 74 | super.onCreate(savedInstanceState); 75 | setContentView(R.layout.activity_main); 76 | init(); 77 | initLocation(); 78 | mContainerLayout = (LinearLayout) findViewById(R.id.map_container); 79 | mAmapView = new TextureMapView(this); 80 | mParams = new LayoutParams(LayoutParams.MATCH_PARENT, 81 | LayoutParams.MATCH_PARENT); 82 | mContainerLayout.addView(mAmapView, mParams); 83 | 84 | mAmapView.onCreate(savedInstanceState); 85 | 86 | mAmapView.getMap().setOnCameraChangeListener(this); 87 | 88 | anappear = new AlphaAnimation(0,1); 89 | andisappear = new AlphaAnimation(1,0); 90 | anappear.setDuration(5000); 91 | andisappear.setDuration(5000); 92 | 93 | // 注册广播,监听应用必须谷歌服务安装情况 94 | mIntentFilter = new IntentFilter( 95 | ConnectivityManager.CONNECTIVITY_ACTION); 96 | mIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); 97 | mIntentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED); 98 | mIntentFilter.addDataScheme("package"); 99 | registerReceiver(mInstallReciver, mIntentFilter); 100 | } 101 | 102 | private void initLocation() { 103 | //初始化client 104 | mlocationClient = new AMapLocationClient(this.getApplicationContext()); 105 | // 设置定位监听 106 | mlocationClient.setLocationListener(this); 107 | //定位参数 108 | mLocationOption = new AMapLocationClientOption(); 109 | //设置为高精度定位模式 110 | mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); 111 | mLocationOption.setOnceLocation(true); 112 | //设置定位参数 113 | mlocationClient.setLocationOption(mLocationOption); 114 | mlocationClient.startLocation(); 115 | } 116 | 117 | private void init() { 118 | mContainerLayout = (LinearLayout) findViewById(R.id.map_container); 119 | mapbtn = (Button)findViewById(R.id.button); 120 | mcheckbtn = (ToggleButton)findViewById(R.id.auto); 121 | mapbtn.setOnClickListener(this); 122 | mcheckbtn.setOnClickListener(this); 123 | mcheckbtn.setOnCheckedChangeListener(this); 124 | } 125 | 126 | 127 | @Override 128 | public void onClick(View v) { 129 | switch (v.getId()){ 130 | case R.id.auto: 131 | mIsAuto = mcheckbtn.isChecked(); 132 | break; 133 | case R.id.button: 134 | mcheckbtn.setChecked(false); 135 | mIsAuto = false; 136 | if (mIsAmapDisplay){ 137 | 138 | changeToGoogleMapView(); 139 | } else { 140 | 141 | changeToAmapView(); 142 | } 143 | break; 144 | } 145 | } 146 | 147 | /** 148 | * 切换为高德地图显示 149 | */ 150 | private void changeToAmapView() { 151 | if (googlemap != null && googlemap.getCameraPosition() != null){ 152 | zoom = googlemap.getCameraPosition().zoom; 153 | latitude = googlemap.getCameraPosition().target.latitude; 154 | longitude = googlemap.getCameraPosition().target.longitude; 155 | mAmapView = new TextureMapView(this, new AMapOptions() 156 | .camera(new com.amap.api.maps.model.CameraPosition(new LatLng(latitude,longitude),zoom,0,0))); 157 | }else { 158 | mlocationClient.startLocation(); 159 | mAmapView = new TextureMapView(this); 160 | 161 | } 162 | mAmapView.onCreate(null); 163 | mAmapView.onResume(); 164 | mContainerLayout.addView(mAmapView, mParams); 165 | 166 | mGoogleMapView.animate().alpha(0f).setDuration(500).setListener(new AnimatorListenerAdapter() { 167 | @Override 168 | public void onAnimationEnd(Animator animation) { 169 | if (mGoogleMapView != null) { 170 | mGoogleMapView.setVisibility(View.GONE); 171 | mContainerLayout.removeView(mGoogleMapView); 172 | mGoogleMapView.onDestroy(); 173 | } 174 | } 175 | }); 176 | mAmapView.getMap().setOnCameraChangeListener(this); 177 | mIsAmapDisplay = true; 178 | mapbtn.setText("To Google"); 179 | } 180 | 181 | 182 | private Handler handler=new Handler(){ 183 | public void handleMessage(Message message){ 184 | mAmapView.setVisibility(View.GONE); 185 | mContainerLayout.removeView(mAmapView); 186 | if (mAmapView != null) { 187 | mAmapView.onDestroy(); 188 | } 189 | } 190 | }; 191 | 192 | /** 193 | * 切换为google地图显示 194 | */ 195 | private void changeToGoogleMapView() { 196 | if (!checkGooglePlayServices()){ 197 | return; 198 | } 199 | zoom = mAmapView.getMap().getCameraPosition().zoom; 200 | latitude = mAmapView.getMap().getCameraPosition().target.latitude; 201 | longitude = mAmapView.getMap().getCameraPosition().target.longitude; 202 | 203 | mapbtn.setText("To Amap"); 204 | mIsAmapDisplay = false; 205 | mGoogleMapView = new com.google.android.gms.maps.MapView(this, new GoogleMapOptions() 206 | .camera(new com.google.android.gms.maps.model 207 | .CameraPosition(new com.google.android.gms.maps.model.LatLng(latitude, longitude), zoom, 0, 0))); 208 | mGoogleMapView.onCreate(null); 209 | mGoogleMapView.onResume(); 210 | mContainerLayout.addView(mGoogleMapView, mParams); 211 | mGoogleMapView.getMapAsync(this); 212 | handler.sendEmptyMessageDelayed(0,500); 213 | } 214 | 215 | @Override 216 | public void onCameraChange(com.amap.api.maps.model.CameraPosition cameraPosition) { 217 | 218 | } 219 | 220 | /** 221 | * 高德地图移动完成回调 222 | * @param cameraPosition 地图移动结束的中心点位置信息 223 | */ 224 | @Override 225 | public void onCameraChangeFinish(com.amap.api.maps.model.CameraPosition cameraPosition) { 226 | longitude = cameraPosition.target.longitude; 227 | latitude = cameraPosition.target.latitude; 228 | zoom = cameraPosition.zoom; 229 | if (!isInArea(latitude, longitude) && mIsAmapDisplay && mIsAuto) { 230 | changeToGoogleMapView(); 231 | } 232 | } 233 | 234 | /** 235 | * 粗略判断当前屏幕显示的地图中心点是否在国内 236 | * @param latitude 纬度 237 | * @param longtitude 经度 238 | * @return 屏幕中心点是否在国内 239 | */ 240 | private boolean isInArea(double latitude, double longtitude) { 241 | if ((latitude > 3.837031) && (latitude < 53.563624) 242 | && (longtitude < 135.095670) && (longtitude > 73.502355)) { 243 | return true; 244 | } 245 | return false; 246 | } 247 | @Override 248 | protected void onResume() { 249 | super.onResume(); 250 | if (mAmapView != null) { 251 | mAmapView.onResume(); 252 | } 253 | if (mGoogleMapView != null) { 254 | try { 255 | mGoogleMapView.onResume(); 256 | } catch (Exception e) { 257 | } 258 | } 259 | } 260 | 261 | @Override 262 | protected void onPause() { 263 | super.onPause(); 264 | if (mAmapView != null) { 265 | mAmapView.onPause(); 266 | } 267 | if (mGoogleMapView != null) { 268 | try { 269 | mGoogleMapView.onPause(); 270 | } catch (Exception e) { 271 | } 272 | } 273 | } 274 | 275 | @Override 276 | protected void onSaveInstanceState(Bundle outState) { 277 | super.onSaveInstanceState(outState); 278 | if (mAmapView != null) { 279 | mAmapView.onSaveInstanceState(outState); 280 | } 281 | if (mGoogleMapView != null) { 282 | try { 283 | mGoogleMapView.onSaveInstanceState(outState); 284 | } catch (Exception e) { 285 | } 286 | } 287 | } 288 | 289 | 290 | @Override 291 | protected void onDestroy() { 292 | super.onDestroy(); 293 | destroyLocation(); 294 | if (mAmapView != null) { 295 | mAmapView.onDestroy(); 296 | } 297 | if (mGoogleMapView != null) { 298 | try { 299 | mGoogleMapView.onDestroy(); 300 | } catch (Exception e) { 301 | } 302 | } 303 | } 304 | 305 | @Override 306 | public void onMapReady(GoogleMap googleMap) { 307 | this.googlemap = googleMap; 308 | if (googlemap != null) { 309 | googlemap.setOnCameraMoveListener(this); 310 | } 311 | } 312 | 313 | /** 314 | * google地图移动回调 315 | */ 316 | @Override 317 | public void onCameraMove() { 318 | CameraPosition cameraPosition=googlemap.getCameraPosition(); 319 | longitude = cameraPosition.target.longitude; 320 | latitude = cameraPosition.target.latitude; 321 | zoom = cameraPosition.zoom; 322 | if (isInArea(latitude, longitude) && !mIsAmapDisplay && mIsAuto) { 323 | changeToAmapView(); 324 | } 325 | } 326 | 327 | @Override 328 | public void onLocationChanged(AMapLocation aMapLocation) { 329 | if (aMapLocation != null 330 | && aMapLocation.getErrorCode() == 0) { 331 | longitude = aMapLocation.getLongitude(); 332 | latitude = aMapLocation.getLatitude(); 333 | if (!aMapLocation.getCountry().equals("中国")){ 334 | changeToGoogleMapView(); 335 | } else { 336 | mAmapView.getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,longitude), 15)); 337 | } 338 | Toast.makeText(MainActivity.this,aMapLocation.getCountry(),Toast.LENGTH_LONG).show(); 339 | mIsAuto = false; 340 | mcheckbtn.setChecked(false); 341 | } else { 342 | String errText = "定位失败," + aMapLocation.getErrorCode() + ": " + aMapLocation.getErrorInfo(); 343 | Log.e("AmapErr", errText); 344 | Toast.makeText(MainActivity.this, errText, Toast.LENGTH_LONG).show(); 345 | } 346 | } 347 | 348 | /** 349 | * 停止定位 350 | * 351 | * @since 2.8.0 352 | * 353 | */ 354 | private void stopLocation(){ 355 | // 停止定位 356 | mlocationClient.stopLocation(); 357 | } 358 | 359 | /** 360 | * 销毁定位 361 | * 362 | */ 363 | private void destroyLocation(){ 364 | if (null != mlocationClient) { 365 | /** 366 | * 如果AMapLocationClient是在当前Activity实例化的, 367 | * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy 368 | */ 369 | mlocationClient.onDestroy(); 370 | mlocationClient = null; 371 | } 372 | } 373 | 374 | @Override 375 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 376 | if (buttonView.getId()==R.id.auto) { 377 | mIsAuto = isChecked; 378 | } 379 | } 380 | 381 | private boolean checkGooglePlayServices(){ 382 | int result = MapsInitializer.initialize(this); 383 | switch (result) { 384 | case ConnectionResult.SUCCESS: 385 | return true; 386 | case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: 387 | Toast.makeText(getApplicationContext(), "SERVICE_VERSION_UPDATE_REQUIRED", Toast.LENGTH_SHORT).show(); 388 | GooglePlayServicesUtil.getErrorDialog(ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED, this, 0).show(); 389 | break; 390 | case ConnectionResult.SERVICE_INVALID: 391 | AlertDialog.Builder m = new AlertDialog.Builder(this) 392 | .setMessage("使用谷歌地图,需要安装谷歌相关服务") 393 | .setPositiveButton("确定", 394 | new DialogInterface.OnClickListener() { 395 | 396 | @Override 397 | public void onClick(DialogInterface dialog, 398 | int which) { 399 | installAPK("Google Play services.apk"); 400 | } 401 | }); 402 | m.show(); 403 | break; 404 | case ConnectionResult.SERVICE_MISSING: 405 | AlertDialog.Builder m1 = new AlertDialog.Builder(this) 406 | .setMessage("使用谷歌地图,需要安装谷歌相关服务") 407 | .setPositiveButton("确定", 408 | new DialogInterface.OnClickListener() { 409 | 410 | @Override 411 | public void onClick(DialogInterface dialog, 412 | int which) { 413 | installAPK("Google Play services.apk"); 414 | } 415 | }); 416 | m1.show(); 417 | break; 418 | 419 | } 420 | return false; 421 | 422 | 423 | } 424 | 425 | 426 | /** 427 | * 安装应用 428 | * */ 429 | private void installAPK(String apkName) { 430 | InputStream is; 431 | try { 432 | is = getApplicationContext().getAssets().open(apkName); 433 | File file = new File(Environment.getExternalStorageDirectory() 434 | .getAbsolutePath() + "/" + apkName); 435 | file.createNewFile(); 436 | FileOutputStream fos = new FileOutputStream(file); 437 | byte[] temp = new byte[1024]; 438 | int i = 0; 439 | while ((i = is.read(temp)) > 0) { 440 | fos.write(temp, 0, i); 441 | } 442 | fos.close(); 443 | is.close(); 444 | Intent intent = new Intent(Intent.ACTION_VIEW); 445 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 446 | intent.setDataAndType( 447 | Uri.parse("file://" 448 | + Environment.getExternalStorageDirectory() 449 | .getAbsolutePath() + "/" + apkName), 450 | "application/vnd.android.package-archive"); 451 | 452 | getApplicationContext().startActivity(intent); 453 | } catch (IOException e) { 454 | 455 | e.printStackTrace(); 456 | } 457 | 458 | } 459 | 460 | /** 461 | * 监听应用安装完成的广播 462 | * */ 463 | private BroadcastReceiver mInstallReciver = new BroadcastReceiver() { 464 | 465 | @Override 466 | public void onReceive(Context context, Intent intent) { 467 | if (intent.getAction() 468 | .equals("android.intent.action.PACKAGE_ADDED") 469 | || intent.getAction() 470 | .equals(Intent.ACTION_PACKAGE_REPLACED)) { 471 | String packageName = intent.getDataString(); 472 | if (packageName.equals("package:com.google.android.gms")) { 473 | installAPK("Google Play.apk"); 474 | } else if (packageName.equals("package:com.android.vending")) { 475 | changeToGoogleMapView(); 476 | } 477 | } 478 | } 479 | }; 480 | } 481 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 23 |