【问题标题】:java.lang.NullPointerException GoogleMaps V2java.lang.NullPointerException GoogleMaps V2
【发布时间】:2013-12-15 05:04:25
【问题描述】:

我刚刚学习了 android 编程来显示地图。 但是当我运行这段代码时,出现了一些错误。谁能解释为什么会发生此错误?我能做些什么来解决这个问题?非常感谢您。

堆栈跟踪:

12-01 02:58:27.324: E/AndroidRuntime(1360): FATAL EXCEPTION: main
12-01 02:58:27.324: E/AndroidRuntime(1360): java.lang.NullPointerException
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.app.Activity.startActivityForResult(Activity.java:3390)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.app.Activity.startActivityForResult(Activity.java:3351)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:839)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.app.Activity.startActivity(Activity.java:3587)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.app.Activity.startActivity(Activity.java:3555)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at com.google.android.gms.dynamic.a$5.onClick(Unknown Source)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.view.View.performClick(View.java:4240)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.view.View$PerformClick.run(View.java:17721)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.os.Handler.handleCallback(Handler.java:730)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.os.Looper.loop(Looper.java:137)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at android.app.ActivityThread.main(ActivityThread.java:5103)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at java.lang.reflect.Method.invokeNative(Native Method)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at java.lang.reflect.Method.invoke(Method.java:525)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-01 02:58:27.324: E/AndroidRuntime(1360):     at dalvik.system.NativeStart.main(Native Method)
12-01 02:58:29.088: I/Process(1360): Sending signal. PID: 1360 SIG: 9

MainActivity.java

package unai.skripsi.mymaps;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

public class MainActivity extends FragmentActivity {

    static final LatLng RAGUNAN = new LatLng(-6.3039, 106.8267);
    static final LatLng TAMANMINI = new LatLng(-6.29436, 106.8859);
    private GoogleMap map;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    map= ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    if (map!=null){
    Marker ragunan = map.addMarker(new MarkerOptions().position(RAGUNAN)
        .title("Ragunan"));
    Marker tamanmini = map.addMarker(new MarkerOptions().position(TAMANMINI)
        .title("Taman mini")
        .snippet("Taman mini itu indah")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));

    map.moveCamera(CameraUpdateFactory.newLatLngZoom(RAGUNAN, 15));
    map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

 }

布局

<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=".MainActivity" >

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout>

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="unai.skripsi.mymaps"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<permission
    android:name="unai.skripsi.mymaps.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="unai.skripsi.mymaps.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission   android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="unai.skripsi.mymaps.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>
    <meta-data android:name="com.google.android.gms.version" 
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="My API KEY" />
</application>

</manifest>

【问题讨论】:

    标签: java android google-maps google-maps-api-3


    【解决方案1】:

    在你的 xml 文件中改变这个 class="com.google.android.gms.maps.MapFragment" android:name="com.google.android.gms.maps.SupportMapFragment"

    将您的活动扩展到 FragmentActivty 并进行更改

    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
            .getMap(); to   
    map= ((SupportMapFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.map)).getMap();
    

    还要检查

    if (map== null) 
                {
              map= ((SupportMapFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.map)).getMap();}
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢兄弟,我试过了,但还是一样的 error.java.lang.NullPointerException 并且我必须从活动更改为片段活动,所以 getSupportFragmentManager() 不会出错。
    • @SiddharthVyas 兄弟什么也没发生,总是同样的错误。顺便说一句,非常感谢。
    • 嘿兄弟,你的代码和我告诉我的更改正在我的设备上运行。只需在清单文件中添加
    • 兄弟,根据你告诉我的内容检查我的更新代码,我也给出了更新错误。非常感谢你的帮助。
    • 你添加了 map= ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();代码中的两次。
    【解决方案2】:

    并确保以下步骤正确与否:

    步骤:

    • 确保设备具有 Google Play 服务 APK
    • 安装 Google Play 服务版本。 2个以上

    • https://code.google.com/apis/console/创建项目
    • 启用“Google Maps Android API v2”
    • 在 API 控制台注册项目中的 SHA1(现在,您需要 WRITE SHA1;your.app.package.name)并获取 API KEY
    • 将目录 ANDROID_SDK_DIR/extras/google/google_play_services/libproject/google-play-services_lib 复制到项目的根目录
    • 将下一行添加到 YOUR_PROJECT/project.properties

    android.library.reference.1=google-play-services_lib

    • 将下一行添加到 YOUR_PROJECT/proguard-project.txt

    -keep class * extends java.util.ListResourceBundle {

    protected Object[][] getContents();

    }

    好的,现在您可以使用适用于 Android 的 Google Map APIs V2 创建您自己的 Google Map 应用了。

    如果您创建应用时最小 SDK = 8,请使用 android 支持库 v4 + SupportMapFragment 而不是 MapFragment。

    见这里,只需在清单文件中使用您的密钥更改 api 密钥,然后按照以下步骤操作: 并确保使用 android 清单文件中提到的包名称生成 api 密钥,并且您的 google_play_services_lib 项目应仅存在于您项目的工作空间中。

    清单文件:

        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="18" />
    
        <uses-feature
            android:glEsVersion="0x00020000"
            android:required="true" />
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.geeklabs.map.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>
    
            <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="replace with your API key"/>
    
        </application>
    
    </manifest>
    

    MainActivity.java:

        package com.geeklabs.map;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    }
    

    activity_main.xml:

        <?xml version="1.0" encoding="utf-8"?>
        <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:name="com.google.android.gms.maps.MapFragment"/>
    

    收到后告诉我。

    【讨论】:

      【解决方案3】:

      如果您的模拟器或设备未安装 Google Play 服务,则可能会出现上述问题。我没有完美的解决方案,但我想出了一些解决方法来避免您的应用程序崩溃。在这种情况下,您必须遵循简单的步骤 1. 重写 startActivityForResult(intent, requestcode) 2.在startActivityForResult中添加super call super.startActivityForResult,在try catch并捕获NullPointerException

      轻松搞定现在您可以在此处捕获 nullpointerexception 并在 catch 中添加错误处理

      【讨论】:

        【解决方案4】:

        如果您在设备中测试此程序,您的程序将适用于 17 级或更高版本,从 2.3.3 开始使用尝试将您的代码设置为 Siddharth Vyas 建议:永远不要向每个人展示你的地图密钥。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-22
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多