如何在安卓应用程序中使用百度api

如何在安卓应用程序中使用百度api,第1张

1)下载百度地图移动版API(Android)开发包

要在Android应用中使用百度地图API,就需要在工程中引用百度地图API开发包,这个开发包包含两个文件:baidumapapi.jar和libBMapApiEngine.so。下载地址:http://dev.baidu.com/wiki/static/imap/files/BaiduMapApi_Lib_Android_1.0.zip

2)申请API Key

和使用Google map api一样,在使用百度地图API之前也需要获取相应的API Key。百度地图API Key与你的百度账户相关联,因此您必须先有百度帐户,才能获得API Key;并且,该Key与您引用API的程序名称有关。

百度API Key的申请要比Google的简单多了,其实只要你有百度帐号,应该不超过30秒就能完成API Key的申请。申请地址:http://dev.baidu.com/wiki/static/imap/key/

3)创建一个Android工程

这里需要强调一点:百度地图移动版api支持Android 1.5及以上系统,因此我们创建的工程应基于Android SDK 1.5及以上。

工程创建完成后,将baidumapapi.jar和libBMapApiEngine.so分别拷贝到工程的根目录及libs/armeabi目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,www.linuxidc.com选定baidumapapi.jar,这样就可以在应用中使用百度地图API了。工程完整的目录结构如下图所示:

4)在布局文件中添加地图控件(res/layout/main.xml)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<com.baidu.mapapi.MapView android:id="@+id/map_View"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:clickable="true"

/>

</LinearLayout>

5)创建Activity继承com.baidu.mapapi.MapActivity

package com.liufeng.baidumap

import android.graphics.drawable.Drawable

import android.os.Bundle

import com.baidu.mapapi.BMapManager

import com.baidu.mapapi.GeoPoint

import com.baidu.mapapi.MapActivity

import com.baidu.mapapi.MapController

import com.baidu.mapapi.MapView

public class MainActivity extends MapActivity {

private BMapManager mapManager

private MapView mapView

private MapController mapController

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.main)

// 初始化MapActivity

mapManager = new BMapManager(getApplication())

// init方法的第一个参数需填入申请的API Key

mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null)

super.initMapActivity(mapManager)

mapView = (MapView) findViewById(R.id.map_View)

// 设置地图模式为交通地图

mapView.setTraffic(true)

// 设置启用内置的缩放控件

mapView.setBuiltInZoomControls(true)

// 用给定的经纬度构造一个GeoPoint(纬度,经度)

GeoPoint point = new GeoPoint((int) (47.118440 * 1E6), (int) (87.493147 * 1E6))

// 创建标记maker

Drawable marker = this.getResources().getDrawable(R.drawable.iconmarka)

// 为maker定义位置和边界

marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight())

// 取得地图控制器对象,用于控制MapView

mapController = mapView.getController()

// 设置地图的中心

mapController.setCenter(point)

// 设置地图默认的缩放级别

mapController.setZoom(12)

}

@Override

protected boolean isRouteDisplayed() {

return false

}

@Override

protected void onDestroy() {

if (mapManager != null) {

mapManager.destroy()

mapManager = null

}

super.onDestroy()

}

@Override

protected void onPause() {

if (mapManager != null) {

mapManager.stop()

}

super.onPause()

}

@Override

protected void onResume() {

if (mapManager != null) {

mapManager.start()

}

super.onResume()

}

}

Context:

一个项目需要重写Android Resource类getDrawable方法,在系统调用Resource.getDrawable时进行拦截,分两种情况:A情况仍旧走正常的调用;B情况则写定制的逻辑。

第一次尝试:

新建一个Resource的子类,并重写getDrawable方法。1.正常调用是super.getDrawable 2.非正常时写自己的逻辑。

可发现在5.0上报错,5.0以下就没问题。

第二次尝试

上官网查了下,发现原来Google在Android 5.0上,新增了一个getDrawable(int id, Resources.Theme theme),系统不会再调用getDrawable(int id)方法,那当然也就拦截不到了,B情况的定制逻辑也就失效了。

把SDK的target调到5.0,重写getDrawable(int id, Resources.Theme theme),当然就ok了。可问题是我要在SDK4.+的情况下开发,那怎么办?

两种做法:在子类新建getDrawable(int id, Resources.Theme theme)进行重写,但是我还需要调用super.getDrawable(int id, Theme theme)方法。在4.+的SDK环境下super即Resource是没有这个办法的,那就没法实现A情况。这可怎么办。

用1.反射调用这个方法2.在方法名上加注释@TargetApi{22}

可问题是反射、注解都没办法实现super.getDrawable这个调用的。

第三次尝试

1.在项目中新建一个android.content.res包结构,并建立Resouce类。

2.将Resource的源码复制到该类中,但是因为系统隐藏API等,可能会报错。

3.把所有方法的方法体内容都删除,返回值是对象的就return null,是基础类型的就随便return 基础类型,void就return。(因为SDK中的API是不会打包到APK中的,只是保持了API的引用,安装到手机上,会自动调用ROM中的相关方法,所以这个复制的类只是为了让项目编译通过而已)。

4.给该类加上getDrawable(int id, Resources.Theme theme),这样我们子类重写Resource方法时,就可以调用super.getDrawable(int id, Resources.Theme theme).。

第四次尝试

大功告成,但发现程序Run as时没问题,但是打包就有问题了。

原因是打包会 调用混淆功能,Resource因被我们复制的类替换了SDK中的类。可是导出APK时不包含这个Resource类的,找不到引用就报错了。可实际上只要安装到手机上,就会调用系统ROM中的Resource类,所以不会产生实际的影响。也就是这个提示是没必要的,那怎么做呢?

在混淆的配置文件proguard-project.txt中加入

-dontwarn android.content.res.**

好了这才是大功告成了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11367708.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存