From ca16a8677a2e5687ce80b67977c1fcac1f63fb11 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 24 Feb 2025 15:20:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=B0=E5=9B=BE=E5=AE=9A?= =?UTF-8?q?=E4=BD=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- positions/README.md | 1 + positions/build.gradle | 3 + positions/build.properties | 4 +- positions/src/main/AndroidManifest.xml | 394 ++++++++--- .../studio/positions/Main2Activity.java | 394 +++++++++++ .../studio/positions/MainActivity.java | 611 +++++++++--------- .../activities/TestMapViewActivity.java | 85 +++ .../positions/fragments/GmsFragment.java | 74 ++- .../res/drawable/ic_location_searching.xml | 11 + .../src/main/res/drawable/ic_my_location.xml | 11 + .../src/main/res/layout/activity_main.xml | 41 +- .../src/main/res/layout/activity_main2.xml | 27 + .../main/res/layout/activity_testmapview.xml | 14 + .../src/main/res/layout/fragment_gms.xml | 13 +- positions/src/main/res/menu/toolbar_main.xml | 4 +- 17 files changed, 1237 insertions(+), 456 deletions(-) create mode 100644 positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java create mode 100644 positions/src/main/java/cc/winboll/studio/positions/activities/TestMapViewActivity.java create mode 100644 positions/src/main/res/drawable/ic_location_searching.xml create mode 100644 positions/src/main/res/drawable/ic_my_location.xml create mode 100644 positions/src/main/res/layout/activity_main2.xml create mode 100644 positions/src/main/res/layout/activity_testmapview.xml diff --git a/gradle.properties b/gradle.properties index d12a593..71ba985 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m +org.gradle.jvmargs=-Xmx4096m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects @@ -18,7 +18,7 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -#org.gradle.caching=true +org.gradle.caching=true android.disableAutomaticComponentCreation=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5a1bbd3..3124347 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl = https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl = https\://services.gradle.org/distributions/gradle-7.5.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/positions/README.md b/positions/README.md index 6acd7f1..2679a36 100644 --- a/positions/README.md +++ b/positions/README.md @@ -4,6 +4,7 @@ 位置应用,与卫星定位有关的应用。可以根据设定的位置与时间条件判断,来发送通知的应用。 #### 软件架构 +以腾讯位置服务SDK源码为基础。源码地址:https://lbs.qq.com/mobile/androidMapSDK/developerGuide/configuration 适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。 也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。 diff --git a/positions/build.gradle b/positions/build.gradle index ad49d77..03efb7b 100644 --- a/positions/build.gradle +++ b/positions/build.gradle @@ -56,6 +56,9 @@ android { } dependencies { + // 定位服务 + implementation 'com.google.android.gms:play-services-location:20.0.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0' diff --git a/positions/build.properties b/positions/build.properties index c81a4c0..a062cf1 100644 --- a/positions/build.properties +++ b/positions/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Feb 24 00:05:11 GMT 2025 +#Mon Feb 24 07:18:15 GMT 2025 stageCount=0 libraryProject= baseVersion=1.0 publishVersion=1.0.0 -buildCount=93 +buildCount=147 baseBetaVersion=1.0.1 diff --git a/positions/src/main/AndroidManifest.xml b/positions/src/main/AndroidManifest.xml index 454b7d4..e799961 100644 --- a/positions/src/main/AndroidManifest.xml +++ b/positions/src/main/AndroidManifest.xml @@ -1,23 +1,38 @@ - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + tools:targetApi="q"> + + + + + + + + - + + + + + + + + + + android:value="@string/demo_type_basic"/> + + + + android:value="@string/demo_type_basic"/> + + + + android:value="@string/demo_type_basic"/> + + + + android:value="@string/demo_type_location"/> + + + + android:value="@string/demo_type_location"/> + + + + android:value="@string/demo_type_basic"/> + + + + android:value="@string/demo_type_basic"/> + + + + android:value="@string/demo_type_basic"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_interactive"/> + + + + android:value="@string/demo_type_transformation"/> + + + + android:value="@string/demo_type_transformation"/> + + + + android:value="@string/demo_type_transformation"/> + + + + android:value="@string/demo_type_transformation"/> + + + + android:value="@string/demo_type_transformation"/> + + + - + android:value="@string/demo_type_transformation"/> + + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_marker"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_route_plan"/> + + + + android:value="@string/demo_type_route_plan"/> + + + + android:value="@string/demo_type_route_plan"/> + + + + android:value="@string/demo_type_route_plan"/> + + + + android:value="@string/demo_type_search"/> + + + + android:value="@string/demo_type_search"/> + + + + android:value="@string/demo_type_search"/> + + + + android:value="@string/demo_type_special"/> + + + + android:value="@string/demo_type_tools"/> + + + + android:value="@string/demo_type_tools"/> + + + + android:value="@string/demo_type_tools"/> + - + + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + + + + android:value="@string/demo_type_draw"/> + - - - - - - - - + + + android:value="@string/demo_type_basic"/> + + + - + android:value="@string/demo_type_draw"/> + + + + android:value="SCYBZ-EC5Y4-XMHUI-FX2PU-ZYMMS-IBB7P"/> + + + diff --git a/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java b/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java new file mode 100644 index 0000000..ba8c7c2 --- /dev/null +++ b/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java @@ -0,0 +1,394 @@ +package cc.winboll.studio.positions; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.telecom.TelecomManager; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.viewpager.widget.ViewPager; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.LogView; +import cc.winboll.studio.libapputils.app.IWinBollActivity; +import cc.winboll.studio.libapputils.app.WinBollActivityManager; +import cc.winboll.studio.libapputils.bean.APPInfo; +import cc.winboll.studio.libapputils.view.YesNoAlertDialog; +import cc.winboll.studio.positions.R; +import com.tencent.map.vector.demo.DemoMainActivity; +import cc.winboll.studio.positions.activities.SettingsActivity; +import cc.winboll.studio.positions.adapters.MyPagerAdapter; +import cc.winboll.studio.positions.beans.MainServiceBean; +import cc.winboll.studio.positions.services.MainService; +import com.google.android.material.tabs.TabLayout; +import java.util.ArrayList; +import java.util.List; +import com.tencent.map.vector.demo.AbsListActivity; +import com.tencent.map.vector.demo.AbsActivity; + +final public class Main2Activity extends AbsActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { + + public static final String TAG = "MainActivity"; + + public static final int REQUEST_HOME_ACTIVITY = 0; + public static final int REQUEST_ABOUT_ACTIVITY = 1; + + public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoll.ACTION_SOS"; + + LogView mLogView; + Toolbar mToolbar; + CheckBox cbMainService; + MainServiceBean mMainServiceBean; + ViewPager viewPager; + private List views; //用来存放放进ViewPager里面的布局 + //实例化存储imageView(导航原点)的集合 + ImageView[] imageViews; + //MyPagerAdapter adapter;//适配器 + MyPagerAdapter pagerAdapter; + LinearLayout linearLayout;//下标所在在LinearLayout布局里 + int currentPoint = 0;//当前被选中中页面的下标 + + private static final int DIALER_REQUEST_CODE = 1; + + @Override + public AppCompatActivity getActivity() { + return this; + } + + @Override + public APPInfo getAppInfo() { +// String szBranchName = "contacts"; +// +// APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); +// appInfo.setAppName("Contacts"); +// appInfo.setAppIcon(cc.winboll.studio.libapputils.R.drawable.ic_winboll); +// appInfo.setAppDescription("Contacts Description"); +// appInfo.setAppGitName("APP"); +// appInfo.setAppGitOwner("Studio"); +// appInfo.setAppGitAPPBranch(szBranchName); +// appInfo.setAppGitAPPSubProjectFolder(szBranchName); +// appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=Contacts"); +// appInfo.setAppAPKName("Contacts"); +// appInfo.setAppAPKFolderName("Contacts"); +// return appInfo; + return null; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + // 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回 + //if (prosessIntents(getIntent())) return; + // 以下正常创建主窗口 + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + // 初始化工具栏 + mToolbar = findViewById(R.id.activitymainToolbar1); + setSupportActionBar(mToolbar); + if (isEnableDisplayHomeAsUp()) { + // 显示后退按钮 + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + getSupportActionBar().setSubtitle(getTag()); + + initData(); + initView(); + //initPoint();//调用初始化导航原点的方法 + viewPager.addOnPageChangeListener(this);//滑动事件 + + ViewPager viewPager = findViewById(R.id.activitymainViewPager1); + MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); + viewPager.setAdapter(pagerAdapter); + TabLayout tabLayout = findViewById(R.id.activitymainTabLayout1); + tabLayout.setupWithViewPager(viewPager); + +// mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); +// if (mMainServiceBean == null) { +// mMainServiceBean = new MainServiceBean(); +// } +// cbMainService = findViewById(R.id.activitymainCheckBox1); +// cbMainService.setChecked(mMainServiceBean.isEnable()); +// cbMainService.setOnClickListener(new View.OnClickListener(){ +// @Override +// public void onClick(View view) { +// if (cbMainService.isChecked()) { +// MainService.startMainService(MainActivity.this); +// } else { +// MainService.stopMainService(MainActivity.this); +// } +// } +// }); + MainService.startMainService(Main2Activity.this); + } + + //初始化view,即显示的图片 + void initView() { + viewPager = findViewById(R.id.activitymainViewPager1); + pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); + viewPager.setAdapter(pagerAdapter); + //adapter = new MyPagerAdapter(views); + //viewPager = findViewById(R.id.activitymainViewPager1); + //viewPager.setAdapter(adapter); + //linearLayout = findViewById(R.id.activitymainLinearLayout1); + //initPoint();//初始化页面下方的点 + viewPager.setOnPageChangeListener(this); + + } + + //初始化所要显示的布局 + void initData() { + ViewPager viewPager = findViewById(R.id.activitymainViewPager1); + LayoutInflater inflater = LayoutInflater.from(getActivity()); + View view1 = inflater.inflate(R.layout.fragment_gms, viewPager, false); + View view2 = inflater.inflate(R.layout.fragment_contacts, viewPager, false); + View view3 = inflater.inflate(R.layout.fragment_log, viewPager, false); + + views = new ArrayList<>(); + views.add(view1); + views.add(view2); + views.add(view3); + } + +// void initPoint() { +// imageViews = new ImageView[5];//实例化5个图片 +// for (int i = 0; i < linearLayout.getChildCount(); i++) { +// imageViews[i] = (ImageView) linearLayout.getChildAt(i); +// imageViews[i].setImageResource(R.drawable.ic_launcher); +// imageViews[i].setOnClickListener(this);//点击导航点,即可跳转 +// imageViews[i].setTag(i);//重复利用实例化的对象 +// } +// currentPoint = 0;//默认第一个坐标 +// imageViews[currentPoint].setImageResource(R.drawable.ic_launcher); +// } + + //OnPageChangeListener接口要实现的三个方法 + /* onPageScrollStateChanged(int state) + 此方法是在状态改变的时候调用,其中state这个参数有三种状态: + SCROLL_STATE_DRAGGING(1)表示用户手指“按在屏幕上并且开始拖动”的状态 + (手指按下但是还没有拖动的时候还不是这个状态,只有按下并且手指开始拖动后log才打出。) + SCROLL_STATE_IDLE(0)滑动动画做完的状态。 + SCROLL_STATE_SETTLING(2)在“手指离开屏幕”的状态。*/ + @Override + public void onPageScrollStateChanged(int state) { + + } + /* onPageScrolled(int position, float positionOffset, int positionOffsetPixels) + 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为: + + position :当前页面,即你点击滑动的页面(从A滑B,则是A页面的position。 + positionOffset:当前页面偏移的百分比 + positionOffsetPixels:当前页面偏移的像素位置*/ + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + /* onPageSelected(int position) + 此方法是页面滑动完后得到调用,position是你当前选中的页面的Position(位置编号) + (从A滑动到B,就是B的position)*/ + public void onPageSelected(int position) { + +// ImageView preView = imageViews[currentPoint]; +// preView.setImageResource(R.drawable.ic_launcher); +// ImageView currView = imageViews[position]; +// currView.setImageResource(R.drawable.ic_launcher); +// currentPoint = position; + } + + //小圆点点击事件 + @Override + public void onClick(View v) { + // TODO Auto-generated method stub + //通过getTag(),可以判断是哪个控件 +// int i = (Integer) v.getTag(); +// viewPager.setCurrentItem(i);//直接跳转到某一个页面的情况 + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + //setSubTitle(""); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + LogUtils.d(TAG, "onDestroy() SOS"); + } + + + + // + // 处理传入的 Intent 数据 + // +// boolean prosessIntents(Intent intent) { +// if (intent == null +// || intent.getAction() == null +// || intent.getAction().equals("")) +// return false; +// +// if (intent.getAction().equals(StringToQrCodeView.ACTION_UNITTEST_QRCODE)) { +// try { +// WinBollActivity clazzActivity = UnitTestActivity.class.newInstance(); +// String tag = clazzActivity.getTag(); +// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag); +// Intent subIntent = new Intent(this, UnitTestActivity.class); +// subIntent.setAction(intent.getAction()); +// File file = new File(getCacheDir(), UUID.randomUUID().toString()); +// //取出文件uri +// Uri uri = intent.getData(); +// if (uri == null) { +// uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); +// } +// //获取文件真实地址 +// String szSrcPath = UriUtils.getFileFromUri(getApplication(), uri); +// if (TextUtils.isEmpty(szSrcPath)) { +// return false; +// } +// +// Files.copy(Paths.get(szSrcPath), Paths.get(file.getPath())); +// //startWinBollActivity(subIntent, tag); +// WinBollActivityManager.getInstance(this).startWinBollActivity(this, subIntent, UnitTestActivity.class); +// } catch (IllegalAccessException | InstantiationException | IOException e) { +// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); +// // 函数处理异常返回失败 +// return false; +// } +// } else { +// LogUtils.d(TAG, "prosessIntents|" + intent.getAction() + "|yet"); +// return false; +// } +// return true; +// } + + @Override + public String getTag() { + return TAG; + } + + @Override + public Toolbar initToolBar() { + return findViewById(R.id.activitymainToolbar1); + } + + @Override + public boolean isAddWinBollToolBar() { + return true; + } + + @Override + public boolean isEnableDisplayHomeAsUp() { + return false; + } + + @Override + public void onBackPressed() { + exit(); + } + + void exit() { + YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){ + + @Override + public void onYes() { + WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); + } + + @Override + public void onNo() { + } + }; + YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.toolbar_main, menu); + return super.onCreateOptionsMenu(menu); + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.item_settings) { + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class); + } else if (item.getItemId() == R.id.item_demomain) { + Intent intent = new Intent(this, com.tencent.map.vector.demo.DemoMainActivity.class); + startActivity(intent); + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class); + } +// } else +// if (item.getItemId() == R.id.item_exit) { +// exit(); +// return true; +// } + return super.onOptionsItemSelected(item); + } + + + @Override + protected void onResume() { + super.onResume(); + } + + /** + * Android M 及以上检查是否是系统默认电话应用 + */ + public boolean isDefaultPhoneCallApp() { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + TelecomManager manger = (TelecomManager) getSystemService(TELECOM_SERVICE); + if (manger != null && manger.getDefaultDialerPackage() != null) { + return manger.getDefaultDialerPackage().equals(getPackageName()); + } + } + return false; + } + + public boolean isServiceRunning(Class serviceClass) { + ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + if (manager == null) return false; + + for (ActivityManager.RunningServiceInfo service : manager.getRunningServices( + Integer.MAX_VALUE)) { + if (serviceClass.getName().equals(service.service.getClassName())) { + return true; + } + } + + return false; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { +// switch (resultCode) { +// case REQUEST_HOME_ACTIVITY : { +// LogUtils.d(TAG, "REQUEST_HOME_ACTIVITY"); +// break; +// } +// case REQUEST_ABOUT_ACTIVITY : { +// LogUtils.d(TAG, "REQUEST_ABOUT_ACTIVITY"); +// break; +// } +// default : { +// super.onActivityResult(requestCode, resultCode, data); +// } +// } + if (requestCode == DIALER_REQUEST_CODE) { + if (resultCode == Activity.RESULT_OK) { + Toast.makeText(Main2Activity.this, getString(R.string.app_name) + " 已成为默认电话应用", + Toast.LENGTH_SHORT).show(); + } + } + } +} diff --git a/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java b/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java index 99ba61d..5fd8de3 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java +++ b/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java @@ -1,311 +1,131 @@ package cc.winboll.studio.positions; -import android.app.Activity; -import android.app.ActivityManager; -import android.content.Context; +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/24 11:05:49 + */ +import cc.winboll.studio.positions.R; import android.content.Intent; -import android.os.Build; import android.os.Bundle; -import android.telecom.TelecomManager; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.Toast; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.viewpager.widget.ViewPager; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.LogView; -import cc.winboll.studio.libapputils.app.IWinBollActivity; -import cc.winboll.studio.libapputils.app.WinBollActivityManager; -import cc.winboll.studio.libapputils.bean.APPInfo; -import cc.winboll.studio.libapputils.view.YesNoAlertDialog; -import cc.winboll.studio.positions.R; -import com.tencent.map.vector.demo.DemoMainActivity; import cc.winboll.studio.positions.activities.SettingsActivity; -import cc.winboll.studio.positions.adapters.MyPagerAdapter; -import cc.winboll.studio.positions.beans.MainServiceBean; -import cc.winboll.studio.positions.services.MainService; -import com.google.android.material.tabs.TabLayout; -import java.util.ArrayList; +import cc.winboll.studio.positions.activities.TestMapViewActivity; +import com.tencent.map.geolocation.TencentLocationManager; +import com.tencent.map.vector.demo.AbsActivity; +import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.TencentMapInitializer; +import com.tencent.tencentmap.mapsdk.maps.TextureMapView; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import android.view.View; +import com.google.android.material.snackbar.Snackbar; +import com.google.android.gms.location.LocationCallback; +import com.google.android.gms.location.LocationRequest; +import com.google.android.gms.location.LocationResult; +import com.google.android.gms.location.FusedLocationProviderClient; +import com.google.android.gms.location.LocationServices; +import com.google.android.gms.tasks.OnSuccessListener; +import cc.winboll.studio.libappbase.LogUtils; +import androidx.core.content.ContextCompat; +import android.Manifest; +import androidx.core.app.ActivityCompat; +import androidx.annotation.NonNull; +import android.content.pm.PackageManager; +import android.widget.Toast; +import android.location.Location; +import android.os.Looper; +import com.hjq.toast.ToastUtils; +import android.widget.TextView; +import com.tencent.map.vector.demo.basic.SupportMapFragmentActivity; +import android.Manifest; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.location.Location; +import android.os.Bundle; +import android.os.Looper; +import androidx.annotation.NonNull; +import android.util.Log; +import android.widget.Toast; + +import cc.winboll.studio.positions.R; +import com.tencent.map.vector.demo.basic.SupportMapFragmentActivity; +import com.tencent.map.geolocation.TencentLocation; +import com.tencent.map.geolocation.TencentLocationListener; +import com.tencent.map.geolocation.TencentLocationManager; +import com.tencent.map.geolocation.TencentLocationRequest; +import com.tencent.tencentmap.mapsdk.maps.LocationSource; +import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor; +import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; +import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle; + import java.util.List; -final public class MainActivity extends AppCompatActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { +import pub.devrel.easypermissions.EasyPermissions; +import androidx.appcompat.app.AppCompatActivity; - public static final String TAG = "MainActivity"; +public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,LocationSource, TencentLocationListener { - public static final int REQUEST_HOME_ACTIVITY = 0; - public static final int REQUEST_ABOUT_ACTIVITY = 1; - - public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoll.ACTION_SOS"; - - LogView mLogView; + public static final String TAG ="MainActivity"; + + private static final int PERMISSION_REQUEST_CODE = 1; + Toolbar mToolbar; - CheckBox cbMainService; - MainServiceBean mMainServiceBean; - ViewPager viewPager; - private List views; //用来存放放进ViewPager里面的布局 - //实例化存储imageView(导航原点)的集合 - ImageView[] imageViews; - //MyPagerAdapter adapter;//适配器 - MyPagerAdapter pagerAdapter; - LinearLayout linearLayout;//下标所在在LinearLayout布局里 - int currentPoint = 0;//当前被选中中页面的下标 - - private static final int DIALER_REQUEST_CODE = 1; - - @Override - public AppCompatActivity getActivity() { - return this; - } - - @Override - public APPInfo getAppInfo() { -// String szBranchName = "contacts"; -// -// APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); -// appInfo.setAppName("Contacts"); -// appInfo.setAppIcon(cc.winboll.studio.libapputils.R.drawable.ic_winboll); -// appInfo.setAppDescription("Contacts Description"); -// appInfo.setAppGitName("APP"); -// appInfo.setAppGitOwner("Studio"); -// appInfo.setAppGitAPPBranch(szBranchName); -// appInfo.setAppGitAPPSubProjectFolder(szBranchName); -// appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=Contacts"); -// appInfo.setAppAPKName("Contacts"); -// appInfo.setAppAPKFolderName("Contacts"); -// return appInfo; - return null; - } + private TextureMapView mapView; + protected TencentMap tencentMap; + TextView mtvInfo; + private LocationSource.OnLocationChangedListener locationChangedListener; + private TencentLocationManager locationManager; + private TencentLocationRequest locationRequest; + private MyLocationStyle locationStyle; + @Override protected void onCreate(Bundle savedInstanceState) { - // 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回 - //if (prosessIntents(getIntent())) return; - // 以下正常创建主窗口 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - + // 初始化工具栏 mToolbar = findViewById(R.id.activitymainToolbar1); setSupportActionBar(mToolbar); - if (isEnableDisplayHomeAsUp()) { - // 显示后退按钮 - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - getSupportActionBar().setSubtitle(getTag()); + getSupportActionBar().setSubtitle(TAG); - initData(); - initView(); - //initPoint();//调用初始化导航原点的方法 - viewPager.addOnPageChangeListener(this);//滑动事件 + TencentMapInitializer.setAgreePrivacy(this, true); + TencentMapInitializer.start(this); + TencentLocationManager.setUserAgreePrivacy(true); - ViewPager viewPager = findViewById(R.id.activitymainViewPager1); - MyPagerAdapter pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); - viewPager.setAdapter(pagerAdapter); - TabLayout tabLayout = findViewById(R.id.activitymainTabLayout1); - tabLayout.setupWithViewPager(viewPager); -// mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); -// if (mMainServiceBean == null) { -// mMainServiceBean = new MainServiceBean(); -// } -// cbMainService = findViewById(R.id.activitymainCheckBox1); -// cbMainService.setChecked(mMainServiceBean.isEnable()); -// cbMainService.setOnClickListener(new View.OnClickListener(){ -// @Override -// public void onClick(View view) { -// if (cbMainService.isChecked()) { -// MainService.startMainService(MainActivity.this); -// } else { -// MainService.stopMainService(MainActivity.this); -// } -// } -// }); - MainService.startMainService(MainActivity.this); - } + mapView = findViewById(R.id.mapview); + mapView.setOpaque(false); + //创建tencentMap地图对象,可以完成对地图的几乎所有操作 + tencentMap = mapView.getMap(); - //初始化view,即显示的图片 - void initView() { - viewPager = findViewById(R.id.activitymainViewPager1); - pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); - viewPager.setAdapter(pagerAdapter); - //adapter = new MyPagerAdapter(views); - //viewPager = findViewById(R.id.activitymainViewPager1); - //viewPager.setAdapter(adapter); - //linearLayout = findViewById(R.id.activitymainLinearLayout1); - //initPoint();//初始化页面下方的点 - viewPager.setOnPageChangeListener(this); + FloatingActionButton fab = findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "点击了悬浮按钮", Snackbar.LENGTH_LONG).show(); + } + }); + + mtvInfo = findViewById(R.id.tv_info); - } - - //初始化所要显示的布局 - void initData() { - ViewPager viewPager = findViewById(R.id.activitymainViewPager1); - LayoutInflater inflater = LayoutInflater.from(getActivity()); - View view1 = inflater.inflate(R.layout.fragment_gms, viewPager, false); - View view2 = inflater.inflate(R.layout.fragment_contacts, viewPager, false); - View view3 = inflater.inflate(R.layout.fragment_log, viewPager, false); - - views = new ArrayList<>(); - views.add(view1); - views.add(view2); - views.add(view3); - } - -// void initPoint() { -// imageViews = new ImageView[5];//实例化5个图片 -// for (int i = 0; i < linearLayout.getChildCount(); i++) { -// imageViews[i] = (ImageView) linearLayout.getChildAt(i); -// imageViews[i].setImageResource(R.drawable.ic_launcher); -// imageViews[i].setOnClickListener(this);//点击导航点,即可跳转 -// imageViews[i].setTag(i);//重复利用实例化的对象 -// } -// currentPoint = 0;//默认第一个坐标 -// imageViews[currentPoint].setImageResource(R.drawable.ic_launcher); -// } - - //OnPageChangeListener接口要实现的三个方法 - /* onPageScrollStateChanged(int state) - 此方法是在状态改变的时候调用,其中state这个参数有三种状态: - SCROLL_STATE_DRAGGING(1)表示用户手指“按在屏幕上并且开始拖动”的状态 - (手指按下但是还没有拖动的时候还不是这个状态,只有按下并且手指开始拖动后log才打出。) - SCROLL_STATE_IDLE(0)滑动动画做完的状态。 - SCROLL_STATE_SETTLING(2)在“手指离开屏幕”的状态。*/ - @Override - public void onPageScrollStateChanged(int state) { - - } - /* onPageScrolled(int position, float positionOffset, int positionOffsetPixels) - 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为: - - position :当前页面,即你点击滑动的页面(从A滑B,则是A页面的position。 - positionOffset:当前页面偏移的百分比 - positionOffsetPixels:当前页面偏移的像素位置*/ - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - /* onPageSelected(int position) - 此方法是页面滑动完后得到调用,position是你当前选中的页面的Position(位置编号) - (从A滑动到B,就是B的position)*/ - public void onPageSelected(int position) { - -// ImageView preView = imageViews[currentPoint]; -// preView.setImageResource(R.drawable.ic_launcher); -// ImageView currView = imageViews[position]; -// currView.setImageResource(R.drawable.ic_launcher); -// currentPoint = position; - } - - //小圆点点击事件 - @Override - public void onClick(View v) { - // TODO Auto-generated method stub - //通过getTag(),可以判断是哪个控件 -// int i = (Integer) v.getTag(); -// viewPager.setCurrentItem(i);//直接跳转到某一个页面的情况 + checkLocationPermission(); + + //设置显示定位的图标 + TencentLocationManager.setUserAgreePrivacy(true); + //建立定位 + initLocation(); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - //setSubTitle(""); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - LogUtils.d(TAG, "onDestroy() SOS"); - } - - - - // - // 处理传入的 Intent 数据 - // -// boolean prosessIntents(Intent intent) { -// if (intent == null -// || intent.getAction() == null -// || intent.getAction().equals("")) -// return false; -// -// if (intent.getAction().equals(StringToQrCodeView.ACTION_UNITTEST_QRCODE)) { -// try { -// WinBollActivity clazzActivity = UnitTestActivity.class.newInstance(); -// String tag = clazzActivity.getTag(); -// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag); -// Intent subIntent = new Intent(this, UnitTestActivity.class); -// subIntent.setAction(intent.getAction()); -// File file = new File(getCacheDir(), UUID.randomUUID().toString()); -// //取出文件uri -// Uri uri = intent.getData(); -// if (uri == null) { -// uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); -// } -// //获取文件真实地址 -// String szSrcPath = UriUtils.getFileFromUri(getApplication(), uri); -// if (TextUtils.isEmpty(szSrcPath)) { -// return false; -// } -// -// Files.copy(Paths.get(szSrcPath), Paths.get(file.getPath())); -// //startWinBollActivity(subIntent, tag); -// WinBollActivityManager.getInstance(this).startWinBollActivity(this, subIntent, UnitTestActivity.class); -// } catch (IllegalAccessException | InstantiationException | IOException e) { -// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); -// // 函数处理异常返回失败 -// return false; -// } -// } else { -// LogUtils.d(TAG, "prosessIntents|" + intent.getAction() + "|yet"); -// return false; -// } -// return true; -// } - - @Override - public String getTag() { - return TAG; - } - - @Override - public Toolbar initToolBar() { - return findViewById(R.id.activitymainToolbar1); - } - - @Override - public boolean isAddWinBollToolBar() { - return true; - } - - @Override - public boolean isEnableDisplayHomeAsUp() { - return false; - } - - @Override - public void onBackPressed() { - exit(); - } - - void exit() { - YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){ - - @Override - public void onYes() { - WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); - } - - @Override - public void onNo() { - } - }; - YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener); +// LatLng center = new LatLng(39.904556, 116.427242); +// tencentMap.moveCamera( +// CameraUpdateFactory.newLatLngZoom(center, 13f) // 注意 13 → 13f +// ); } @Override @@ -314,7 +134,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct return super.onCreateOptionsMenu(menu); } - @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.item_settings) { @@ -325,6 +144,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct Intent intent = new Intent(this, com.tencent.map.vector.demo.DemoMainActivity.class); startActivity(intent); //WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class); + } else if (item.getItemId() == R.id.item_testmapview) { + Intent intent = new Intent(this, TestMapViewActivity.class); + startActivity(intent); + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, CallActivity.class); } // } else // if (item.getItemId() == R.id.item_exit) { @@ -334,59 +157,201 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct return super.onOptionsItemSelected(item); } + /** + * mapview的生命周期管理 + */ + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } @Override protected void onResume() { super.onResume(); - } - - /** - * Android M 及以上检查是否是系统默认电话应用 - */ - public boolean isDefaultPhoneCallApp() { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - TelecomManager manger = (TelecomManager) getSystemService(TELECOM_SERVICE); - if (manger != null && manger.getDefaultDialerPackage() != null) { - return manger.getDefaultDialerPackage().equals(getPackageName()); - } - } - return false; - } - - public boolean isServiceRunning(Class serviceClass) { - ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - if (manager == null) return false; - - for (ActivityManager.RunningServiceInfo service : manager.getRunningServices( - Integer.MAX_VALUE)) { - if (serviceClass.getName().equals(service.service.getClassName())) { - return true; - } - } - - return false; + mapView.onResume(); } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { -// switch (resultCode) { -// case REQUEST_HOME_ACTIVITY : { -// LogUtils.d(TAG, "REQUEST_HOME_ACTIVITY"); -// break; -// } -// case REQUEST_ABOUT_ACTIVITY : { -// LogUtils.d(TAG, "REQUEST_ABOUT_ACTIVITY"); -// break; -// } -// default : { -// super.onActivityResult(requestCode, resultCode, data); -// } -// } - if (requestCode == DIALER_REQUEST_CODE) { - if (resultCode == Activity.RESULT_OK) { - Toast.makeText(MainActivity.this, getString(R.string.app_name) + " 已成为默认电话应用", - Toast.LENGTH_SHORT).show(); + protected void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } + + @Override + protected void onRestart() { + super.onRestart(); + mapView.onRestart(); + } + + + + /** + * 设置定位图标样式 + */ + private void setLocMarkerStyle(){ + locationStyle = new MyLocationStyle(); + //创建图标 + BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getBitMap(R.drawable.marker)); + locationStyle.icon(bitmapDescriptor); + //设置定位圆形区域的边框宽度 + locationStyle.strokeWidth(3); + //设置圆区域的颜色 + locationStyle.fillColor(R.color.style); + + tencentMap.setMyLocationStyle(locationStyle); + } + + + + private Bitmap getBitMap(int resourceId){ + Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + int newWidth = 55; + int newHeight = 55; + float widthScale = ((float)newWidth)/width; + float heightScale = ((float)newHeight)/height; + Matrix matrix = new Matrix(); + matrix.postScale(widthScale, heightScale); + bitmap = Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true); + return bitmap; + } + + + + /** + * 定位的一些初始化设置 + */ + private void initLocation(){ + //用于访问腾讯定位服务的类, 周期性向客户端提供位置更新 + locationManager = TencentLocationManager.getInstance(this); + //设置坐标系 + locationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02); + //创建定位请求 + locationRequest = TencentLocationRequest.create(); + //设置定位周期(位置监听器回调周期)为3s + locationRequest.setInterval(3000); + + //地图上设置定位数据源 + tencentMap.setLocationSource(this); + //设置当前位置可见 + tencentMap.setMyLocationEnabled(true); + //设置定位图标样式 + setLocMarkerStyle(); +// locationStyle = locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE); + tencentMap.setMyLocationStyle(locationStyle); + } + /** + * 实现位置监听 + * @param tencentLocation + * @param i + * @param s + */ + @Override + public void onLocationChanged(TencentLocation tencentLocation, int i, String s) { + + if(i == TencentLocation.ERROR_OK && locationChangedListener != null){ + Location location = new Location(tencentLocation.getProvider()); + //设置经纬度以及精度 + location.setLatitude(tencentLocation.getLatitude()); + location.setLongitude(tencentLocation.getLongitude()); + location.setAccuracy(tencentLocation.getAccuracy()); + locationChangedListener.onLocationChanged(location); + + //显示回调的实时位置信息 + runOnUiThread(new Runnable() { + @Override + public void run() { + //打印tencentLocation的json字符串 +// Toast.makeText(getApplicationContext(), new Gson().toJson(location), Toast.LENGTH_LONG).show(); + } + }); + } + } + + @Override + public void onStatusUpdate(String s, int i, String s1) { + //GPS, WiFi, Radio 等状态发生变化 + Log.v("State changed", s +"===" + s1); + } + + + @Override + public void activate(OnLocationChangedListener onLocationChangedListener) { + locationChangedListener = onLocationChangedListener; + + int err = locationManager.requestLocationUpdates(locationRequest, this, Looper.myLooper()); + switch (err) { + case 1: + Toast.makeText(this,"设备缺少使用腾讯定位服务需要的基本条件",Toast.LENGTH_SHORT).show(); + break; + case 2: + Toast.makeText(this,"manifest 中配置的 key 不正确",Toast.LENGTH_SHORT).show(); + break; + case 3: + Toast.makeText(this,"自动加载libtencentloc.so失败",Toast.LENGTH_SHORT).show(); + break; + + default: + break; + } + } + + @Override + public void deactivate() { + locationManager.removeUpdates(this); + locationManager = null; + locationRequest = null; + locationChangedListener=null; + } + + @Override + public void onPermissionsGranted(int requestCode, @NonNull List perms) { + Log.e("location quest: ","success"); + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + Log.e("location quest: ","failed"); + } + + private void checkLocationPermission() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED + || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, + PERMISSION_REQUEST_CODE); + } else { + // 权限已授予,可进行定位操作 + //startLocationUpdates(); + } + } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PERMISSION_REQUEST_CODE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + //startLocationUpdates(); + } else { + // 用户拒绝了权限请求 + Toast.makeText(this, "请授予定位权限", Toast.LENGTH_SHORT).show(); } } } + + + } diff --git a/positions/src/main/java/cc/winboll/studio/positions/activities/TestMapViewActivity.java b/positions/src/main/java/cc/winboll/studio/positions/activities/TestMapViewActivity.java new file mode 100644 index 0000000..22c8a63 --- /dev/null +++ b/positions/src/main/java/cc/winboll/studio/positions/activities/TestMapViewActivity.java @@ -0,0 +1,85 @@ +package cc.winboll.studio.positions.activities; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/24 12:14:04 + */ +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +import cc.winboll.studio.positions.R; +import com.tencent.map.vector.demo.heatoverlay.ScatterPlotOverlayActivity; +import com.tencent.tencentmap.mapsdk.maps.MapView; +import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.TencentMapOptions; +import com.tencent.tencentmap.mapsdk.maps.TextureMapView; +import com.tencent.tencentmap.mapsdk.maps.model.LatLng; + +public class TestMapViewActivity extends AppCompatActivity { + + public static final String TAG = "TestMapViewActivity"; + + /** + * 由于SDK并没有提供用于MapView管理地图生命周期的Activity + * 因此需要用户继承Activity后管理地图的生命周期,防止内存泄露 + */ + + private TextureMapView mapView; + protected TencentMap tencentMap; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_testmapview); + + mapView = findViewById(R.id.mapview); + mapView.setOpaque(false); + //创建tencentMap地图对象,可以完成对地图的几乎所有操作 + tencentMap = mapView.getMap(); + + } + + + /** + * mapview的生命周期管理 + */ + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + protected void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } + + @Override + protected void onRestart() { + super.onRestart(); + mapView.onRestart(); + } +} diff --git a/positions/src/main/java/cc/winboll/studio/positions/fragments/GmsFragment.java b/positions/src/main/java/cc/winboll/studio/positions/fragments/GmsFragment.java index 1006ddb..a1157e6 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/fragments/GmsFragment.java +++ b/positions/src/main/java/cc/winboll/studio/positions/fragments/GmsFragment.java @@ -17,6 +17,9 @@ import androidx.annotation.NonNull; import android.graphics.Color; import android.widget.TextView; import cc.winboll.studio.positions.views.GridMapView; +import com.tencent.tencentmap.mapsdk.maps.MapView; +import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.TextureMapView; public class GmsFragment extends Fragment { @@ -24,7 +27,9 @@ public class GmsFragment extends Fragment { private static final String ARG_PAGE = "ARG_PAGE"; private int mPage; - + private TextureMapView mapView; + protected TencentMap tencentMap; + public static GmsFragment newInstance(int page) { Bundle args = new Bundle(); args.putInt(ARG_PAGE, page); @@ -47,19 +52,60 @@ public class GmsFragment extends Fragment { @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_gms, container, false); - // 初始化视图 - GridMapView mapView = (GridMapView) view.findViewById(R.id.map_view); - - // 设置网格参数 - mapView.setGridParameters(10000f, 10000f, 10f); - - // 初始化显示区域(中心点400,300,显示范围2000x200) - mapView.initViewport(5000f, 5000f, 1000f, 1000f); - - // 绘制图形 - mapView.drawPoint(5000f, 5000f, Color.RED, 8f); - mapView.drawCircle(5000f, 5000f, 50f, Color.BLUE, 8f); - mapView.drawLine(4975f, 4975f, 5025f, 5025f, Color.GREEN, 2f); +// // 初始化视图 +// GridMapView mapView = (GridMapView) view.findViewById(R.id.map_view); +// +// // 设置网格参数 +// mapView.setGridParameters(10000f, 10000f, 10f); +// +// // 初始化显示区域(中心点400,300,显示范围2000x200) +// mapView.initViewport(5000f, 5000f, 1000f, 1000f); +// +// // 绘制图形 +// mapView.drawPoint(5000f, 5000f, Color.RED, 8f); +// mapView.drawCircle(5000f, 5000f, 50f, Color.BLUE, 8f); +// mapView.drawLine(4975f, 4975f, 5025f, 5025f, Color.GREEN, 2f); + + // 初始化地图视图 + mapView = view.findViewById(R.id.mapView); + mapView.setOpaque(false); + //创建tencentMap地图对象,可以完成对地图的几乎所有操作 + tencentMap = mapView.getMap(); + return view; } + + + /** + * mapview的生命周期管理 + */ + @Override + public void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + public void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } } diff --git a/positions/src/main/res/drawable/ic_location_searching.xml b/positions/src/main/res/drawable/ic_location_searching.xml new file mode 100644 index 0000000..f009b89 --- /dev/null +++ b/positions/src/main/res/drawable/ic_location_searching.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/positions/src/main/res/drawable/ic_my_location.xml b/positions/src/main/res/drawable/ic_my_location.xml new file mode 100644 index 0000000..6c00b88 --- /dev/null +++ b/positions/src/main/res/drawable/ic_my_location.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/positions/src/main/res/layout/activity_main.xml b/positions/src/main/res/layout/activity_main.xml index 5376c86..b950813 100644 --- a/positions/src/main/res/layout/activity_main.xml +++ b/positions/src/main/res/layout/activity_main.xml @@ -5,23 +5,48 @@ xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + tools:context=".MainActivity"> - + android:layout_weight="1.0"> - + + + + + + + + + diff --git a/positions/src/main/res/layout/activity_main2.xml b/positions/src/main/res/layout/activity_main2.xml new file mode 100644 index 0000000..5376c86 --- /dev/null +++ b/positions/src/main/res/layout/activity_main2.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/positions/src/main/res/layout/activity_testmapview.xml b/positions/src/main/res/layout/activity_testmapview.xml new file mode 100644 index 0000000..0bfc294 --- /dev/null +++ b/positions/src/main/res/layout/activity_testmapview.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/positions/src/main/res/layout/fragment_gms.xml b/positions/src/main/res/layout/fragment_gms.xml index da50968..20cd5c3 100644 --- a/positions/src/main/res/layout/fragment_gms.xml +++ b/positions/src/main/res/layout/fragment_gms.xml @@ -6,15 +6,10 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - + diff --git a/positions/src/main/res/menu/toolbar_main.xml b/positions/src/main/res/menu/toolbar_main.xml index 2e69bae..1ca20e7 100644 --- a/positions/src/main/res/menu/toolbar_main.xml +++ b/positions/src/main/res/menu/toolbar_main.xml @@ -2,8 +2,8 @@ + android:id="@+id/item_testmapview" + android:title="TestMapViewActivity"/>