Android:使用api Google Maps崩溃启动应用程序 [英] Android: Crash start application using api google maps

查看:79
本文介绍了Android:使用api Google Maps崩溃启动应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注.

由于您正在使用SupportFragment,因此您还需要添加支持库.检查以下链接

https://developer.android.com/tools/extras/support-library.html

I'm following this https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_api to learn to use Google Map API.

This is my manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dude.uniplaces"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>


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

    <permission
        android:name="com.dude.uniplaces.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.dude.uniplaces.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <permission
        android:name="com.dude.uniplaces.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
<uses-permission android:name="com.dude.uniplaces.permission.MAPS_RECEIVE"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="com.google.android.maps" />          
        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="com.dude.uniplaces" />
            </intent-filter>
        </receiver>

        <service android:name="com.dude.uniplaces.GCMIntentService" />

        <activity
            android:name="com.dude.uniplaces.Index"
            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.dude.uniplaces.Dude"
            android:label="dude" >
        </activity>
        <activity
            android:name="com.dude.uniplaces.SendMess"
            android:label="sendmess" >
        </activity>
        <meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyBUO0v3_pHsRXfnGyJ68AeZkCUtHINw6OA"/>

    </application>

</manifest>

This is my xml file of main activity:

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

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Index" >  


    <Button
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="Invia Messaggio"
     android:onClick="sendMex" />
    <fragment 
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:name="com.google.android.gms.maps.MapFragment"/>



</RelativeLayout>

This is my main activity :

package com.dude.uniplaces;
import static com.dude.uniplaces.CommonUtilities.DISPLAY_MESSAGE_ACTION;
import static com.dude.uniplaces.CommonUtilities.EXTRA_MESSAGE;
import static com.dude.uniplaces.CommonUtilities.SENDER_ID;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Toast;

import com.google.android.gcm.GCMRegistrar;


public class Index extends Activity {
    ProgressDialog progressBar;
    AsyncTask<Void, Void, Void> mRegisterTask;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.index);
        // Phone is ready
        GCMRegistrar.checkDevice(this);
        // Checking Manifest
        GCMRegistrar.checkManifest(this);
        registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION));
        // Ottieni il Registration ID
        final String regId = GCMRegistrar.getRegistrationId(this);
        // Controllo se sono registrato
        if (regId.equals("")) {
            // Mi registro
            GCMRegistrar.register(this, SENDER_ID);
        } else {
            // Sono registrato
            if (!GCMRegistrar.isRegisteredOnServer(this)) {
                // Provo a registrarmi ancora

                final Context context = this;
                mRegisterTask = new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {
                        ServerUtilities.register(context, regId);
                        return null;
                    }
                    @Override
                    protected void onPostExecute(Void result) {
                        mRegisterTask = null;
                    }
                };
                mRegisterTask.execute(null, null, null);
            }
        }
        /* Here I should be registred */
        /* Now is time to take gps coordinates */
        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) {
          Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
          startActivity(intent);
        } 


        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Map<String, String> params = new HashMap<String, String>();
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);
        String message="x";
        String Id = GCMRegistrar.getRegistrationId(this);
        if( location != null)
             message = String.format("%1$s \n%2$s \n%3$s",Id,
                                        location.getLongitude(), location.getLatitude()
                                );
        if(location == null )
            params.put("one", "BONAA");
        else
        params.put("one", message);
        ServerUtilities su = new ServerUtilities();
        su.go("http://unipiapp.altervista.org/cord.php",params);




    }
    /**
     * Ricevo notifica push
     * */
    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
            // Sveglia il telefono se è in stand-by
            WakeLocker.acquire(getApplicationContext());
            // Visualizza il messaggio
            Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show();
            // Rilascia il wavelocker
            WakeLocker.release();
        }
    };
    @Override
    protected void onDestroy() {
        if (mRegisterTask != null) {
            mRegisterTask.cancel(true);
        }
        try {
            unregisterReceiver(mHandleMessageReceiver);
            GCMRegistrar.onDestroy(this);
        } catch (Exception e) {
        }
        super.onDestroy();
    }

/* Function call clickin on button */
public void sendMex(View w)
{
    Intent intent = new Intent(Index.this, SendMess.class);
    startActivity(intent);

}

} /* END CLASS */

I Downloaded google play service and add it to my workspace, but When I try to start application in my phone, it crashes:

05-04 20:11:24.441: E/AndroidRuntime(11190): FATAL EXCEPTION: main 05-04 20:11:24.441: E/AndroidRuntime(11190): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dude.uniplaces/com.dude.uniplaces.Index}: android.view.InflateException: Binary XML file line #19: Error inflating class fragment


EDIT: I modified my index.xml as you saw me, then I added (think) in right way google libs, but i still take crash!


Solution:

I solved adding import android.support.v4.app.FragmentActivity; and chancing extends Activity with FragmentActivity

解决方案

Your min sdk in 8

Note : If you wish to run the app on api 11 and lower You will need to add support library as well.

http://developer.android.com/tools/extras/support-library.html

Use this

  android:name="com.google.android.gms.maps.SupportMapFragment"

Also make sure you have followed all the steps from the below link

https://developers.google.com/maps/documentation/android/start

Edit

https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapFragment

MapFragment for api 12 and higher support fragment for api 11 and lower

Also make sure you map project references google play services library project.

Refer your google play services in your map project

To check if its a library project. right click on your project goto properties. choose android. check if Is Library is ticked.

To refer the library project in your map project.

right click on your project goto properties. choose android. Click add, browse the library project click add and ok. Notice the green tick below.

For more information check the below link

https://developer.android.com/tools/projects/projects-eclipse.html.

You also need to add Support library since you are using SupportFragment. Check the below link

https://developer.android.com/tools/extras/support-library.html

这篇关于Android:使用api Google Maps崩溃启动应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆