0

我正在使用谷歌地图 API V2 开发一个 android 应用程序,应用程序崩溃并且我有这个错误。

06-04 12:26:31.980:E/AndroidRuntime(16726):致命异常:主要 06-04 12:26:31.980:E/AndroidRuntime(16726):java.lang.NoClassDefFoundError:com.google.android.gms。 R$styleable 06-04 12:26:31.980: E/AndroidRuntime(16726): at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source) 06-04 12:26:31.980: E/AndroidRuntime( 16726): 在 com.google.android.gms.maps.SupportMapFragment.onInflate(未知来源) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 android.support.v4.app.FragmentActivity.onCreateView( FragmentActivity.java:279) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 06-04 12:26:31.980: E/AndroidRuntime( 16726): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:466) 06-04 12:26:31.980:E/AndroidRuntime(16726): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:396) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 android.view.LayoutInflater.inflate(LayoutInflater.java :352) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256) 06-04 12:26:31.980: E /AndroidRuntime(16726): 在 android.app.Activity.setContentView(Activity.java:1867) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 com.its.android.MainActivity.onCreate(MainActivity. java:29) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 android.app.Activity.performCreate(Activity.java:5008) 06-04 12:26:31.980: E/AndroidRuntime(16726) : 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 06-04 12:26:31.980: E/AndroidRuntime(16726):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 06-04 12:26:31.980: E/AndroidRuntime(16726): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)

我可以使用此代码显示地图 public class MainActivity extends FragmentActivity {

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SupportMapFragment fragment = new SupportMapFragment();
    getSupportFragmentManager().beginTransaction()
            .add(android.R.id.content, fragment).commit();

}}

但是当我尝试使用此代码添加标记时,应用程序崩溃

public class MainActivity extends FragmentActivity {

      private GoogleMap mMap;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setUpMapIfNeeded();
        }

        @Override
        protected void onResume() {
            super.onResume();
            setUpMapIfNeeded();
        }

        private void setUpMapIfNeeded() {

            if (mMap == null) {

                mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                        .getMap();

                if (mMap != null) {
                    setUpMap();
                }
            }
        }

        private void setUpMap() {
            mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        }

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.SupportMapFragment"/>

我添加了谷歌服务的库

AndroidManifest.xml

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

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

    <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" />

    <permission
             android:name="com.its.android.permission.MAPS_RECEIVE"
             android:protectionLevel="signature" />
    <uses-permission android:name="com.its.android.permission.MAPS_RECEIVE" /> 

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

    <application
                android:allowBackup="true"
                android:icon="@drawable/ic_launcher"
                android:label="@string/app_name"
                android:theme="@style/AppTheme" >               

                <activity
                        android:name="com.its.android.SplashActivity"
                        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="com.its.android.MainActivity"
                        android:label="@string/app_name" />

                <uses-library android:name="com.google.android.maps" />     
                <meta-data
                        android:name="com.google.android.maps.v2.API_KEY"
                        android:value="xxxxx"/> 
    </application>

 </manifest>
4

5 回答 5

0

将 google-play-services_lib 作为项目导入,同时将选择副本导入工作区

您是否添加了所有这些权限?

<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" />
<!--
 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" />

<permission
    android:name="YOUR PACKAGE.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="YOUR PACKAGE.permission.MAPS_RECEIVE" />
于 2013-06-04T05:11:30.553 回答
0

将 google play services 项目添加为库,而不是将 jar 文件放在 libs 文件夹中。

于 2013-06-04T05:07:58.320 回答
0

如果您的活动是由启动器消息启动的?片段需要默认初始化程序。

尝试按意图运行第二个活动。

试试这个代码。

Intent intent = new Intent(this, [map activity].class);
statrtActivity(intent);
于 2013-06-04T08:03:07.193 回答
0
import Google-play-services_lib from the android sdk

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;

import org.json.JSONObject;

import android.app.Dialog;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;


public class MainActivity extends FragmentActivity implements LocationListener{

    GoogleMap mGoogleMap;   
    Spinner mSprPlaceType;  

    String[] mPlaceType=null;
    String[] mPlaceTypeName=null;

    double mLatitude=0;
    double mLongitude=0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

        // Array of place types
        mPlaceType = getResources().getStringArray(R.array.place_type);

        // Array of place type names
        mPlaceTypeName = getResources().getStringArray(R.array.place_type_name);

        // Creating an array adapter with an array of Place types
        // to populate the spinner
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, mPlaceTypeName);

        // Getting reference to the Spinner 
        mSprPlaceType = (Spinner) findViewById(R.id.spr_place_type);

        // Setting adapter on Spinner to set place types
        mSprPlaceType.setAdapter(adapter);

        Button btnFind;

        // Getting reference to Find Button
        btnFind = ( Button ) findViewById(R.id.btn_find);


        // Getting Google Play availability status
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());


        if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available

            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();

        }else { // Google Play Services are available

            // Getting reference to the SupportMapFragment
            SupportMapFragment fragment = ( SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

            // Getting Google Map
            mGoogleMap = fragment.getMap();

            // Enabling MyLocation in Google Map
            mGoogleMap.setMyLocationEnabled(true);



            // Getting LocationManager object from System Service LOCATION_SERVICE
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

            // Creating a criteria object to retrieve provider
            Criteria criteria = new Criteria();

            // Getting the name of the best provider
            String provider = locationManager.getBestProvider(criteria, true);

            // Getting Current Location From GPS
            Location location = locationManager.getLastKnownLocation(provider);

            if(location!=null){
                    onLocationChanged(location);
            }

            locationManager.requestLocationUpdates(provider, 20000, 0, this);

            // Setting click event lister for the find button
            btnFind.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {   


                    int selectedPosition = mSprPlaceType.getSelectedItemPosition();
                    String type = mPlaceType[selectedPosition];


                    StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
                    sb.append("location="+mLatitude+","+mLongitude);
                    sb.append("&radius=5000");
                    sb.append("&types="+type);
                    sb.append("&sensor=true");
                    sb.append("&key=AIzaSyDX_1T5Cd826EVg9kIeJVdpWBadtTrBPcY");


                    // Creating a new non-ui thread task to download Google place json data 
                    PlacesTask placesTask = new PlacesTask();                                   

                    // Invokes the "doInBackground()" method of the class PlaceTask
                    placesTask.execute(sb.toString());


                }
            });

        }       

    }

    /** A method to download json data from url */
    private String downloadUrl(String strUrl) throws IOException{
        Log.d("strUrl",""+strUrl);
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try{
                URL url = new URL(strUrl);                


                // Creating an http connection to communicate with url 
                urlConnection = (HttpURLConnection) url.openConnection();                

                // Connecting to url 
                urlConnection.connect();                

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

                StringBuffer sb  = new StringBuffer();

                String line = "";
                while( ( line = br.readLine())  != null){
                        sb.append(line);
                }

                data = sb.toString();

                br.close();

        }catch(Exception e){
                Log.d("Exception while downloading url", e.toString());
        }finally{
                iStream.close();
                urlConnection.disconnect();
        }

        return data;
    }         


    /** A class, to download Google Places */
    private class PlacesTask extends AsyncTask<String, Integer, String>{

        String data = null;

        // Invoked by execute() method of this object
        @Override
        protected String doInBackground(String... url) {
            try{
                data = downloadUrl(url[0]);
            }catch(Exception e){
                 Log.d("Background Task",e.toString());
            }
            return data;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(String result){            
            ParserTask parserTask = new ParserTask();

            // Start parsing the Google places in JSON format
            // Invokes the "doInBackground()" method of the class ParseTask
            parserTask.execute(result);
        }

    }

    /** A class to parse the Google Places in JSON format */
    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{

        JSONObject jObject;

        // Invoked by execute() method of this object
        @Override
        protected List<HashMap<String,String>> doInBackground(String... jsonData) {

            List<HashMap<String, String>> places = null;            
            PlaceJSONParser placeJsonParser = new PlaceJSONParser();

            try{
                jObject = new JSONObject(jsonData[0]);

                /** Getting the parsed data as a List construct */
                places = placeJsonParser.parse(jObject);

            }catch(Exception e){
                    Log.d("Exception",e.toString());
            }
            return places;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(List<HashMap<String,String>> list){            

            // Clears all the existing markers 
            mGoogleMap.clear();

            for(int i=0;i<list.size();i++){

                // Creating a marker
                MarkerOptions markerOptions = new MarkerOptions();

                // Getting a place from the places list
                HashMap<String, String> hmPlace = list.get(i);

                // Getting latitude of the place
                double lat = Double.parseDouble(hmPlace.get("lat"));                

                // Getting longitude of the place
                double lng = Double.parseDouble(hmPlace.get("lng"));

                // Getting name
                String name = hmPlace.get("place_name");

                // Getting vicinity
                String vicinity = hmPlace.get("vicinity");

                LatLng latLng = new LatLng(lat, lng);

                // Setting the position for the marker
                markerOptions.position(latLng);

                // Setting the title for the marker. 
                //This will be displayed on taping the marker
                markerOptions.title(name);
                markerOptions.snippet(vicinity);

                // Placing a marker on the touched position
                mGoogleMap.addMarker(markerOptions);            

            }       

        }

    }



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

    @Override
    public void onLocationChanged(Location location) {
        mLatitude = location.getLatitude();
        mLongitude = location.getLongitude();
        Log.d("mLatitude",""+mLatitude);
        Log.d("mLongitude",""+mLongitude);
        LatLng latLng = new LatLng(mLatitude, mLongitude);

        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12));

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

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

    }
}
于 2013-06-04T05:42:03.180 回答
0

你这样做是错误的方式:

在活动布局文件中,您可以这样做:

<?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.SupportMapFragment"/>

因此,您在 xml 文件中定义了一个地图片段。

另一方面,您正在尝试从代码创建地图片段的实例并手动添加它:

 SupportMapFragment fragment = new SupportMapFragment();
getSupportFragmentManager().beginTransaction()
        .add(android.R.id.content, fragment).commit();

所以基本上你添加了两次地图片段,它们没有相互连接。

您应该做的另一件事是删除此行:

<uses-library android:name="com.google.android.maps" />     

这是 API V1 权限,与 API V2 无关。

于 2013-06-04T08:32:08.943 回答