关于 java.lang.IllegaAccessError:Class ref in pre-verified class resoved to unexpected implementation

归类于Android 参与评论

初始Adroid 魔幻威力,遇此一难题,四处搜寻解决之道。

错误现象:在将程序安装到模拟器,并启动程序时直接报错。提示主程序严重异常。

原因:由于一开始没有直接指定BuildTarget的GoogleMapAPI,所以自己直接将map.jar复制到了lib下,导致环境中跟项目中都有map.jar,多出了,导致出错。

解决方法:删除lib下的map.jar,指定BuildTarget为GoogleMapAPI。

就此google 地图正常出现。爽哉!

———–一些详细示例———————:

http://www.cnblogs.com/zhangdongzi/archive/2012/01/09/2317632.html

http://hi.baidu.com/168dengruijun/item/6adab9bb6d687ba6eaba93cc

http://noobjava.iteye.com/blog/1004781

http://wenku.baidu.com/view/704d821ea76e58fafab003b0.html

http://wenku.baidu.com/view/1706d7ea6294dd88d0d26bd3.html

https://developers.google.com/maps/?hl=zh-CN

———–以下为一些参考——————-:

这2天在研究了一下Google map,遇到了一个错误

:java.lang.IllegaAccessError:Class ref in

pre-verified class resoved to unexpected

implementation

这个错误的意思是引进了没有必要的包。经过1的

纠结,我才发现我在建工程的时候Build Target

没有选择“Google APIs‘,所以在程序中用到

google map的类

的时候eclipse会提示我引进外面google map的包

,所以导致了这个 错误,fk,浪费了我一天的时

间。希望以后编程能够细心一点!

Android Google Map API 开发基础知识

归类于Android 参与评论

开发基于谷歌地图的应用和普通的android应用差不多都要使用它提供给我们的类库,所不同的是google map的类库不是android平台的基本类库,是google api的一部分,所以建立项目时,SDK要选择Google APIs;

还有一点,开发基于地图的应用时候需要使用google map的APIkey,必须先申请key,然后才能开发基于地图的应用。

下边分步骤记录下,整个过程:

 一、申请google Maps API key(用于开发和debug)

为了能顺利的申请Android Map API Key,必须要准备google的账号和系统的证明书。一般Google发布Key都需要Google账号,Google账号是通用的,Gmail的账号就可以。当一个程序发布时必须要证明书,证明书其实就是MD5.我们这里并不是发布,而只是为了开发测试,可以使用Debug版的证明书,下面我们就来学习如何申请Debug版的Key:

1.找到你的debug.keystore文件

在Eclipse工具下,选择windows–>Preference–>Android–>Build,其中Default debug keystore的值便是debug.keystore的路径了。

2.取得debug.keystore的MD5值

首先cmd命令行进入debug.keystore文件所在的路径,执行命令:keytool -list -keystore debug.keystore,这时可能会提示你输入密码,这里默认的密码是“android”,这样即可取得MD5值。

3.申请Android Map 的API Key.

打开浏览器,输入网址:http://code.google.com/android/maps-api-signup.html,填入你的认证指纹(MD5)即可获得apiKey了,结果显示如下:

感谢您注册 Android 地图 API 密钥!
您的密钥是:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我IE打开的时候是乱码,不知道是不是自己电脑有问题。后来改用了chrome就正常显示了。

到此,我们就完成了API Key的申请了,记录下Key值,在后续开发中使用。(放在layout中加入的MapView中)

二.Google Map API的使用

Android中定义了一个名为com.google.android.map的包,其中包含了一系列用于在google map上显示、控制和叠层信息的功能类,以下是该包中最重要的几个类:

1.MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层网络。MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity,并且在其派生类的onCreate()中,都要创建一个MapView实例。

2.MapView:MapView是用于显示地图的View组件。它派生自android.view.ViewGroup。它必须和MapActivity配合使用,而且只能被MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文件系统,而这些线程需要有MapActivity来管理。

3.MapController:MapController用于控制地图的移动、缩放等。

4.OverLay:这是一个可显示于地图之上的可绘制的对象。

5.GeoPoint:这是一个包含经纬度位置的对象。

三.实例开发

1.创建工程,注意SDK旋转为”Goolge APIs”

2.修改AndroidManifest.xml文件

由于使用Google Map API,所以必须添加<uses-library android:name=”com.google.android.maps” />

由于需要从网络获取地图数据,所以需要访问网络的权限<uses-permission android:name=”android.permission.INTERNET”/>

可能还需要添加其他权限。

例如:

AndroidManifest.xml

复制代码
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.yarin.android.Examples_09_03″
android:versionCode=”1″
android:versionName=”1.0″>
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<uses-library android:name=”com.google.android.maps” />
<activity android:name=”.Activity01″
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>
<uses-permission android:name=”android.permission.INTERNET” />
<uses-sdk android:minSdkVersion=”5″ />
</manifest>
复制代码

3.创建MapView

要显示地图,需要创建一个MapView,在Xml文件中的布局如下。其中的android:apiKey的值就是我们第一步申请的Key了。

main.xml

复制代码
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<com.google.android.maps.MapView
android:id=”@+id/MapView01″
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:apiKey=”0AubmfALdupLSlQkE67OTXgcQgWtyhXcO7uhsIQ”/>
</RelativeLayout>
复制代码

当然,可以在程序中通过如下代码来创建MapView:

MapView map = new MapView( this, “(android maps api key)”);

4.实现MapActivity

MapView需要由MapActivity来管理,所以程序部分应该继承自MapActivity类,必须实现isRouteDisplay方法。

MapView提供了3中模式的地图,分别可以通过以下方式设置采用什么模式来显示地图。

mMapView.setTraffic(true); //设置为交通模式

mMapView.setSatellite(true); //设置为卫星模式//

mMapView.setStreetView(false); //设置为街景模式

通过setBuiltZoomControls方法设置地图是否支持缩放。

5.MapController的使用

如果需要设置地图显示的地点以及放大倍数等,就需要使用MapController来控制地图。可以通过如下代码获得MapController对象:

mMapController = mMapView.getController();

要定位地点,需要构造一个GeoPoint来表示地点的经纬度,然后使用animateTo方法将地图定位到指定的GeoPoint上,代码如下:

//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);

6.Ovelay的使用

如果需要在地图上标注一些图标文字等信息,就需要使用Overlay。这里我们首先要将地图上的经度和纬度转换成屏幕上的实际坐标,才能将信息绘制上去。Map API中提供了Projection.toPixels(GeoPoint in,GeoPoint out)方法,可以将经度和纬度转换成屏幕上的坐标。

首先需要实现OverLay中的draw方法才能在地图上绘制信息,代码如下:

复制代码
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
……..
}
}
复制代码

综合上面的代码如下

Activity01.java

复制代码
import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;public class Activity01 extends MapActivity
{
private MapView mMapView;
private MapController mMapController;
private GeoPoint mGeoPoint;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.MapView01);
//设置为交通模式
// mMapView.setTraffic(true);
//设置为卫星模式
// mMapView.setSatellite(true);
//设置为街景模式
mMapView.setStreetView(false);
//取得MapController对象(控制MapView)
mMapController = mMapView.getController();
mMapView.setEnabled(true);
mMapView.setClickable(true);
//设置地图支持缩放
mMapView.setBuiltInZoomControls(true);

//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);
//设置倍数(1-21)
mMapController.setZoom(15);

//添加Overlay,用于显示标注信息
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = mMapView.getOverlays();
list.add(myLocationOverlay);
}
protected boolean isRouteDisplayed()
{
return false;
}
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
Point myScreenCoords = new Point();
// 将经纬度转换成实际屏幕坐标
mapView.getProjection().toPixels(mGeoPoint, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 0, 0);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.home);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText(“天府广场”, myScreenCoords.x, myScreenCoords.y, paint);
return true;
}
}
}

复制代码

android模拟器上网问题

归类于Android 参与评论

有可能是DNS的问题:

Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人(像我)来讲,一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单,只要把模拟器的默认DNS设置成电脑的DNS地址即可。

使用adb的shell,确认系统的各项属性

adb shell

getprop

getprop会列出系统当前的各项属性

在结果里可以看到:

[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]

第四步:把dns改成我们自己的DNS

setprop net.dns1 192.168.1.1

通过Android模拟器运行网络通信程序详细

归类于Android 参与评论

mars课程里关于Socket通信那一课说那些程序只能在真机上运行,模拟器模拟不了,实际上是可以的。
Android模拟器是通过一个类似路由器的虚拟网络层与电脑相连,可以看作模拟器是处于“内网”当中,每个模拟器都有自己的虚拟路由器,而且虚拟路由器的地址总是10.0.2.1,在模拟器看来,电脑的地址是10.0.2.2,模拟器自己的地址是10.0.2.15,无论你启动多少个模拟器,对于模拟器来说都是这样的地址,模拟器之间不能直接通信。
启动模拟器的时候,电脑会给模拟器分配两个端口,通过这两个端口,电脑就能操作模拟器。第一个启动的模拟器的端口是5554和5555,第二个是5556和5557,以此类推,最多可以同时启动32个模拟器。第一个端口(偶数端口)可以接受telnet连接,对模拟器进行设置,第二个端口(奇数端口)则接受adb连接,可以用来调试。第一个端口可以在模拟器窗口的标题栏看到,如下图所示:

5554表示端口号,t表示模拟器名称。
实际上,这些端口也是电脑监听的端口,在电脑上通过netstat可以看到本机正在监听这些端口,因此通过telnet localhost 5554就能连上第一台模拟器,连上之后通过help命令可以查看操作帮助。
为了实现电脑和模拟器上的android程序进行socket通信,需要把程序开启的端口通过端口映射设置到电脑上,这跟家里的路由器端口映射概念是一样的。telnet到模拟器之后,通过
redir add tcp:1234:1234
就能把模拟器上的1234端口映射到电脑上,第一个表示电脑端口,第二个表示模拟器程序要使用端口,这两个数字可以相同也可以不同,要映射udp端口就把tcp改为udp即可
redir add udp:1234:1234
这样一来,当模拟器的程序打开1234端口时,在电脑上也打开了对应的端口,只要通过电脑连接127.0.0.1的对应端口,就连上了模拟器的程序端口,就可以通过电脑上的client向模拟器的server发送数据,不需要通过真机运行。
如果要让第一个模拟器向第二个模拟器发送数据,也可以把第二个模拟器的端口映射到电脑上,然后在第一个模拟器程序中向10.0.2.2的对应端口发送数据即可。

模拟器还有一个很有意思的功能,每个模拟器默认的电话号码就是它的第一个端口号,例如开了两个模拟器,第一个拨打5556,第二个就会显示5554来电,还能接通,发短信也可以,这样就能模拟电话和短信功能。

详细的信息可以看Dev Guide的模拟器部分:http://developer.android.com/guide/developing/devices/emulator.html

[详解+多图]赶紧收藏吧,Android开发环境配置搭建超级详细

归类于Android 参与评论

[详解+多图]赶紧收藏吧,Android开发环境配置搭建超级详细

一 相关下载
(1) java JDK下载:
进入该网页: http://java.sun.com/javase/downloads/index.jsp (或者直接点击下载)如下图:


选择 Download JDK 只下载JDK,无需下载jre.

(2)eclipse下载
进入该网页: http://www.eclipse.org/downloads/ (或者直接点击下载:BT下载    HTTP下载) 如下图:

我们选择第一个(即eclipse IDE for java EE Developers)
(3)下载Android SDK
说明: Android SDK两种下载版本,一种是包含具体版本的SDK的,一种是只有升级工具,而不包含具体的SDK版本,后一种大概20多M,前一种70多M。
完全版下载 (android sdk 2.1 r01)     升级版下载 (建议使用这个,本例子就是使用这个这里面不包含具体版本,想要什么版本在Eclipse里面升级就行)
二 软件安装
(1)安装jdk 6u19   安装完成即可,无需配置环境变量
(2)解压eclipse       eclipse无需安装,解压后,直接打开就行
(3)解压android sdk     这个也无需安装,解压后供后面使用
(4)最终有三个文件夹,如下图:

三 Eclipse配置
1 安装android 开发插件
(1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare 出现如下界面:

点击 Add按钮,出现如下界面

输入网址: https://dl-ssl.google.com/android/eclipse/    (如果出错,请将https改成http)
名称: Android (这里可以自定义)
点击OK,将出现如下界面

点击 Next按钮 ,出现如下界面:

点击Next按钮,出现如下界面:

选择 I accept the terms of the license agreements   点击Next,进入安装插件界面

安装完成后,出现如下界面

点击Yes按钮,重启Eclipse
2 配置android sdk
(1)点击菜单window->preferences,进入如下界面

选择你的android SDK解压后的目录,选错了就会报错,这个是升级工具,目前还没有一个版本的SDK
(2)升级SDK版本,选择菜单 window->Android sdk and avd manager 出现如下界面

选择update all按钮,出现如下界面

选择左边的某一项,点击accept表示安装,点击reject表示不安装,我这里只选了SDK 2.1 和samples for api 7 , 自己可以任意自定义,确定后,选择install按钮,进入安装界面如下:

安装完成如下:

(3)新建AVD(android vitural device)    和上面一样,进入android sdk and avd manager,选中Vitural Devices 在点击New按钮

点击New按钮后,进入如下界面:

名称可以随便取,target选择你需要的SDK版本,SD卡大小自定义,点击 Create AVD,得到如下结果

如上显示创建AVD完毕

3 新建Android项目
(1)选择菜单file->new->other 进入如下界面:

选择新建Android Project项目,点击Next按钮,进入如下界面

名称自定义,应用程序名自定义,报名必须包含一个点以上,min SDK version里面必须输入整数
点击Next出现如下界面:

注: 若有错误如: Project … is missing required source folder: ‘gen’ ,则将gen->Android.Test->R.java这个文件删掉,Eclipse会为我们重新生成这个文件,并且不会报错。
(3)配置运行
右键项目->Run as -> Run Configuration 进入如下界面:
该界面,点击Browse 按钮,选择你要运行的项目
选择Target切换到以下界面

该界面选择运行的AVD,将AVD前面的方框设置为选择状态。

(4)测试项目运行
右键项目名称->run as ->Android Application 即可启动运行该Android程序,如下所示:

正在进入

测试程序运行结果

四 结束语
至此,android开发环境搭建完毕,有问题请留言。在这里要注意,我这里只是下载了android sdk r4升级工具,没有下载具体的SDK,而是通过在Eclipse里面的Android Sdk管理工具升级的,你也可以直接下载具体的SDK版本,如: Android sdk 2.1 r1 上面有这个的下载链接,但我任务用升级工具更好。

顶部