针对在MapsAPIV2中导入KML和导入map包这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android2.3和GoogleMapsAPIv2、AndroidGoogleMapsAP
针对在Maps API V2中导入KML和导入map包这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android 2.3和Google Maps API v2、Android Google Maps API V2中心标记、Android Google Maps API v2的内存泄漏、Android Maps API v2 – 标记旋转的方法?等相关知识,希望可以帮助到你。
本文目录一览:- 在Maps API V2中导入KML(导入map包)
- Android 2.3和Google Maps API v2
- Android Google Maps API V2中心标记
- Android Google Maps API v2的内存泄漏
- Android Maps API v2 – 标记旋转的方法?
在Maps API V2中导入KML(导入map包)
我在Google Earth中绘制了多个KML文件,其中包含不同的路线。现在,我正在尝试使用Maps API V2在我的android项目中显示这些内容。
是否存在现有的库,用于在您的android项目中导入KML文件并在地图中显示它们?我在不是库的堆栈溢出中找到了一些代码(如何使用kml文件在地图上绘制路径?)。
如果没有可用的库,我将从头开始构建它。
答案1
小编典典现在,我只是假设没有公共图书馆为我们做这件事,因此在解析我的KML文件中的数据后,我将使用Google的代码向地图添加折线和多边形。如果找到库,将更新此答案。
创建折线和多边形:
// Instantiates a new Polyline object and adds points to define a rectanglePolylineOptions rectOptions = new PolylineOptions() .add(new LatLng(37.35, -122.0)) .add(new LatLng(37.45, -122.0)) // North of the previous point, but at the same longitude .add(new LatLng(37.45, -122.2)) // Same latitude, and 30km to the west .add(new LatLng(37.35, -122.2)) // Same longitude, and 16km to the south .add(new LatLng(37.35, -122.0)); // Closes the polyline.// Set the rectangle''s color to redrectOptions.color(Color.RED);// Get back the mutable PolylinePolyline polyline = myMap.addPolyline(rectOptions);
Android 2.3和Google Maps API v2
今天,我尝试使用适用于Android 2.3.3的Google Maps api v2我的步骤:
- 从debug.keystore获得SHA1代码
- 在Google API控制台中创建一个新项目
- 注册一个新的ID
- 启用了Google Maps android api v2
- 使用输入SHA1创建一个Android密钥; it.mappe(it.mappe是我的包)
- 获取API密钥
- 更新AndroidManifest文件:
<permission android:name="it.mappe.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
<uses-permission android:name="it.mappe.permission.MAPS_RECEIVE" />
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-feature android:glEsVersion="0x00020000" android:required="true"` />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="MY_KEY" />
<activity
android:name="it.mappe.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
- 我的主要活动
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
-
我的activity_main:
<fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent"/>
-
将目录复制
ANDROID_SDK_DIR/extras/google/google_play_services/libproject/google-play-services_lib
到项目的根目录 -
添加
/extras/android/compatibility/v4/android-support-v4.jar
为外部罐 -
将下一行添加到
YOUR_PROJECT/project.properties
android.library.reference.1=google-play-services_lib
当我在三星银河S上运行它(使用Google Play服务apk)时,它崩溃并且logcat显示此错误
E/AndroidRuntime(6435): FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{it.mappe/it.mappe.MainActivity}:
android.view.InflateException: Binary XML file line #2: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:209)
at android.app.Activity.setContentView(Activity.java:1657)
at it.mappe.MainActivity.onCreate(MainActivity.java:12)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
... 11 more
Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/it.mappe-2.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at android.view.LayoutInflater.createView(LayoutInflater.java:471)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
... 19 more
一些建议?
编辑
这是我的main.xml:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Android Google Maps API V2中心标记
有没有一种方法可以使地图尽可能放大,但同时将所有标记保留在屏幕上。我有六个标记形状不一致的标记。我当时只是想把他们的中心放在地图上,但是我仍然不知道我可以通过编程方式放大地图多远。
每次创建地图时,这些标记都会更改位置。理想情况下,我将使用一个脚本来放大地图,以便将所有视图都包含在视图中。
这样你就明白了。我一次从json创建一个标记,并在循环中添加以下行。
mMap.addMarker(new MarkerOptions().position(new LatLng(lat,lng)).title(c.getString("title")));
答案1
小编典典您应该使用CameraUpdate类来(可能)进行所有程序化地图移动。
为此,首先像这样计算所有标记的边界:
LatLngBounds.Builder builder = new LatLngBounds.Builder();for each (Marker m : markers) { builder.include(m.getPosition());}LatLngBounds bounds = builder.build();
然后通过使用工厂获取运动描述对象:CameraUpdateFactory:
int padding = 0; // offset from edges of the map in pixelsCameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
最后移动地图:
googleMap.moveCamera(cu);
或者,如果您想要动画:
googleMap.animateCamera(cu);
Android Google Maps API v2的内存泄漏
我在Google Maps Android API v2上遇到内存泄漏问题.在以下情况下,每当我的视图再次变为可见时,堆使用量将增加约85KB:
>手机屏幕关闭(例如,按电源按钮后).
>用户按“主页”按钮退出应用程序.
该应用最终因OutOfMemory异常而崩溃.屏幕旋转或通过“返回”按钮退出时不会发生泄漏.关于变通办法或此问题背后的原因有任何想法吗?
我的代码:
public class LeakActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak);
}
}
和XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/map_1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
解决方法:
这可能与Maps API中的未解决问题有关:
Issue 4766 – Bug: Android Maps API v2 leaks huge amounts of memory
使用DDMS的“转储HPROF”工具转储hprof文件,使用hprof-conv对其进行转换,然后使用MAT检查泄漏.如果它在Google Maps API中,请在未解决的问题上发布apk(或更简单的测试代码)并包含hprof文件.
如果与我遇到的错误相同,则可能仅在Android 2.x上发生,请也进行检查.
Android Maps API v2 – 标记旋转的方法?
我们需要指向特定地理方向的标记.在V1中,我们可以在绘制时建立指向正确方向的位图,但在V2中,无法更改标记位图.
我不确定最好的方法是在地图旋转时(这听起来像是一个性能问题)破坏并重新构建我们所有的标记,或者尝试自己绘制它们.这可能是通过TileOverlay或我们自己的视图,我们坐在地图上.
我真的不喜欢这些方法.有没有人试过它们?
更新:
我已经尝试通过我们自己的视图绘图,但是当拖动地图时,这太过于迟钝了.
我现在正在摧毁&重新创建标记,但这是(正如预期的)性能问题,需要〜2000mS来更新60个标记.
解决方法
他们还添加了平面标记,我猜这与原始问题更相关.展平标记始终保持最初在地图上绘制的方向:https://developers.google.com/maps/documentation/android/marker#flatten_a_marker
唯一的要求是您引用最新版本的Google Play服务.
今天关于在Maps API V2中导入KML和导入map包的分享就到这里,希望大家有所收获,若想了解更多关于Android 2.3和Google Maps API v2、Android Google Maps API V2中心标记、Android Google Maps API v2的内存泄漏、Android Maps API v2 – 标记旋转的方法?等相关知识,可以在本站进行查询。
本文标签: