1

Google Maps API を使用する必要があるアプリに取り組んでいます。私はこの問題に2日間取り組んできました。API のバージョン 2 を使用しているため、マップ フラグメントを使用しています。そのため、マップ フラグメントから Google マップを取得して変数に割り当てようとするとGoogleMap googleMap、null ポインター例外がスローされます。GoogleMap オブジェクトが格納されているフラグメントを見つけるのに問題があると思います。ほぼすべてを試しました。サポートマップフラグメントを使用して、メインアクティビティのxmlファイルにフラグメントを配置し、プログラムでフラグメントをxmlファイルに追加しようとしました。これらのソリューションでは他の問題が発生しましたが、NPE はすべてのソリューションで一貫していました。今はかなり近づいているように感じますが、最終的に機能させるには少し助けが必要です.

これが私のGoogleMapsアクティビティコードです:

package com.parse.starter;

import android.app.*;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.*;
import com.google.android.gms.maps.SupportMapFragment;
import com.parse.*;
import com.parse.starter.R;

import java.util.List;

public class OutbreakMap extends FragmentActivity implements LocationListener {
    double lat=50;
    double longi=50;
    private LocationManager locationManager;
    private String provider;
    private GoogleMap googleMap;
    Fragment fragment;


    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(isGooglePlayOn())    {
            setContentView(R.layout.map_layout);
        }
        //Add the map fragment
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragment = new com.parse.starter.MapFragment();
        fragmentTransaction.add(R.id.myfragment, fragment);
        fragmentTransaction.commit();

        // Get the location manager
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);

         // Check if enabled and if not send user to the GSP settings
         // Better solution would be to display a dialog and suggesting to
        // go to the settings
        if (!enabled) {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

            // set title
            alertDialogBuilder.setTitle("Turn On Your GPS");

            // set dialog message
            alertDialogBuilder
                    .setMessage("Please turn on your GPS to track sickness in your area!")
                    .setCancelable(false)
                    .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, close
                            // current activity
                            OutbreakMap.this.finish();
                            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            startActivity(intent);
                        }
                    })
                    .setNegativeButton("No",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, just close
                            // the dialog box and do nothing
                            dialog.cancel();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();

            // show it
            alertDialog.show();

        }
        // Define the criteria how to select the locatioin provider -> use
        // default
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);

        // Initialize the location fields
        if (location != null) {
            System.out.println("Provider " + provider + " has been selected.");
            onLocationChanged(location);
        } else {
            Toast.makeText(getApplicationContext(),"Location not found",Toast.LENGTH_SHORT).show();
        }

        setUpMapIfNeeded();
        googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        if(location != null)  {
            lat=location.getLatitude();
            longi=location.getLongitude();
        }

        CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(lat,longi))      // Sets the center of the map to lat,longi (which is 50,50 if the current location isnt found)
                    .zoom(17)                   // Sets the zoom
                    .build();                   // Creates a CameraPosition from the builder
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

        UiSettings uiSettings=googleMap.getUiSettings();
        uiSettings.setAllGesturesEnabled(false);
        // Initialize the location fields
        if (location != null) {
            System.out.println("Provider " + provider + " has been selected.");
            onLocationChanged(location);
        } else {
        Toast.makeText(getApplicationContext(),"Couldn't Find Location",Toast.LENGTH_SHORT).show();
        }



        ParseGeoPoint userLoc= new ParseGeoPoint(lat,longi);
        ParseQuery query= new ParseQuery("Outbreak");
        query.whereWithinMiles("location",userLoc,1);
        query.findInBackground(new FindCallback() {
            public void done(List<ParseObject> objects, ParseException e) {
                if (e == null) {
                GetOutbreaks.getOutBreaksNearMe(googleMap,lat,longi,objects);
                Toast.makeText(getApplicationContext(),"Recieved Outbreak Data",Toast.LENGTH_SHORT).show();
                } else {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),"Could Not Download Data",Toast.LENGTH_SHORT).show();
                }
            }

        });


//        moveToPrescription();
//        moveToPrescription();
    }


    /* Request updates at startup */
    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(provider, 400, 1, this);
    }

    /* Remove the locationlistener updates when Activity is paused */
    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location) {
        int lat = (int) (location.getLatitude());
        int lng = (int) (location.getLongitude());
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(this, "Enabled new provider " + provider,
                Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onProviderDisabled(String provider) {
        Toast.makeText(this, "Disabled provider " + provider,
                Toast.LENGTH_SHORT).show();
    }

    public void moveToPrescription(){
        Intent intent = new Intent(this,Prescription.class);
        startActivity(intent);
    }

    public void setUpMapIfNeeded() {
        if(googleMap==null) {
           googleMap= ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

        }
        else {

        }
    }

    public boolean isGooglePlayOn() {
        int status=GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if(status== ConnectionResult.SUCCESS)   {
            return true;
        }
        ((Dialog) GooglePlayServicesUtil.getErrorDialog(status,this,10)).show();
        Toast.makeText(this,"Google Play Services cannot be found", Toast.LENGTH_SHORT).show();
        return false;
    }

}

これが私のアクティビティの xml ファイルです (内側の線形レイアウトはマップ フラグメントのホルダーです)。

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <FrameLayout
            android:id="@+id/mapContainer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        <LinearLayout
                android:id="@+id/myfragment"
                android:layout_width="match_parent"
                android:layout_weight="4"
                android:layout_height="match_parent" />
    </FrameLayout>
</LinearLayout>

マップ フラグメントの xml ファイルは次のとおりです。

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

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:tag="map_fragment"
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          class="com.google.android.gms.maps.MapFragment"/>

そして最後に、これが私の Android マニフェストです。

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

    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15"/>
    <permission
            android:name="com.parse.starter.permission.MAPS_RECEIVE"
            android:protectionLevel="signature"/>
    <uses-permission android:name="com.parse.starter.permission.MAPS_RECEIVE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <!-- The following two permissions are not required to use
         Google Maps Android API v2, but are recommended. -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

    <application
        android:name="ParseApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ParseStarterProjectActivity"

            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Register"/>
        <activity android:name=".Login"/>
        <activity android:name=".Home"/>
        <activity android:name=".OutbreakMap"/>
        <activity android:name=".Prescription"/>
        <activity android:name=".MyPrescriptions"/>
        <receiver android:name=".AlarmManagerBroadcastReceiver"></receiver>

        <uses-library android:name="com.google.android.maps"/>
        <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="MY API KEY IS HERE"/>
    </application>
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

</manifest>

申し訳ありませんが、LogCat ダイアログが消去されてしまい、テストしていた電話が離れなければならなかった友人のものであるため、持っていません。しかし、それは基本的に、それが言う行にNPEがあったと言いましsetUpMapIfNeeded();googleMap= ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();. また、AndroidManifest.xml ファイルでは、一番下に「シンボル '0x00020000' を解決できません」と表示されていることに注意してください<uses-feature android:glEsVersion="0x00020000" android:required="true"/>。ただし、アプリのコンパイルとインストールは停止しません。すべての助けをありがとう、それは非常に感謝しています。

4

2 に答える 2