我正在使用Android版谷歌地图v2进行一个项目,在根HTC Desire HD上实例化谷歌地图片段时,我得到了一个NoSuchFieldError
。
尽管如此,这个问题不应该是由设备上没有安装Google Play服务引起的(尽管这些服务和其他使用Google Maps v2的应用程序都在工作)。
在设置Activity
的内容视图之前,我尝试过检查设备上是否安装了Google Play Services库(通过调用GooglePlayServicesUtil.isGooglePlayServicesAvailable
)。
此外,该应用程序在其他安卓手机上运行,地图片段被成功膨胀。
目前,我怀疑这个问题是由我在Eclipse中的Android项目设置引起的,因为在打包或部署过程中,Google Play Services库项目似乎没有与我的项目一起包含。
谷歌地图只在某些设备上工作,而在其他设备上抛出NoSuchFieldError
异常,有人解决过这个问题吗?如果是,我该怎么办才能解决这个问题?
如果您需要更多信息,如项目设置和/或代码,请留言。
谢谢!
这是来自ACRA的JSON格式的堆栈跟踪报告:
{ CUSTOM_DATA: '',
STACK_TRACE: 'java.lang.NoSuchFieldError: com.google.android.gms.R$string.common_google_play_services_unsupported_textntat com.google.android.gms.common.GooglePlayServicesUtil.b(Unknown Source)ntat com.google.android.gms.internal.bb.a(Unknown Source)ntat com.google.android.gms.internal.bb.onCreateView(Unknown Source)ntat com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)ntat android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)ntat android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)ntat android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)ntat android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)ntat android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280)ntat android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)ntat android.view.LayoutInflater.rInflate(LayoutInflater.java)ntat android.view.LayoutInflater.inflate(LayoutInflater.java)ntat android.view.LayoutInflater.inflate(LayoutInflater.java)ntat android.view.LayoutInflater.inflate(LayoutInflater.java)ntat com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java)ntat android.app.Activity.setContentView(Activity.java)ntat ro.myapp.app.activities.MapActivity.onCreate(MapActivity.java:62)ntat android.app.Activity.performCreate(Activity.java)ntat android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)ntat android.app.ActivityThread.performLaunchActivity(ActivityThread.java)ntat android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)ntat android.app.ActivityThread.access$600(ActivityThread.java)ntat android.app.ActivityThread$H.handleMessage(ActivityThread.java)ntat android.os.Handler.dispatchMessage(Handler.java)ntat android.os.Looper.loop(Looper.java)ntat android.app.ActivityThread.main(ActivityThread.java)ntat java.lang.reflect.Method.invokeNative(Native Method)ntat java.lang.reflect.Method.invoke(Method.java)ntat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)ntat com.android.internal.os.ZygoteInit.main(ZygoteInit.java)ntat dalvik.system.NativeStart.main(Native Method)n',
PHONE_MODEL: 'HTC Desire HD',
ANDROID_VERSION: '4.0.4' }
这是我的onCreate
方法抛出异常:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
checkForPlayServices();
setContentView(R.layout.activity_map);
mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
map = mapFragment.getMap();
map.setMyLocationEnabled(true);
map.setInfoWindowAdapter(this);
map.setOnInfoWindowClickListener(this);
}
activity_map.xml
布局内容:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapActivity" >
<ro.myapp.app.views.actionbar.ActionbarMap
android:id="@+id/actionBar"
android:layout_width="match_parent"
android:layout_height="@dimen/myapp_actionbar_height" />
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/actionBar"
class="com.google.android.gms.maps.SupportMapFragment" />
</RelativeLayout>
java.lang.NoSuchFieldError: com.google.android.gms.R$string.common_google_play_services_unsupported_text
确切地说明了问题所在。
在values/strings.xml中没有
<string name="common_google_play_services_unsupported_text">...</string>
定义。
我在我的google-play-services_lib/res中看到了这个值的定义,所以你可能想检查一下你是否正确地将这个库项目添加到了你的工作区中。更新库时似乎忘记了更新strings.xml。
好的,所以我改变了我的答案,我发现有一种方法可以找出是否有任何东西覆盖了你的libs。。。。您在某个地方使用位置对象,所以添加这段代码并在运行其中一个设备时对其进行调试。。。。。位置对象应该在您的位置侦听器中。
location.getClass().getProtectionDomain().getCodeSource().getLocation() ;