Sunny
Sunny

Reputation: 14818

Android mapView different in phone and emulator

About App:--This is a simple app which find the user current location.

Problem:-- The app works fine on emulator please see the image.

enter image description here

But in phone it is not showing the MapView.Please see the image.

enter image description here

Please tell me what is going wrong with the phone. In Phone it just download the huge(20 mb) data but not show the actual map.

Logcat im getting -

   10-31 16:44:45.994: E/MapActivity(3026): Couldn't get connection factory client

  10-31 15:47:42.319: ERROR/MapView(1773): java.lang.IllegalStateException: Null Bitmap!   "loading_tile"; if seen during a test, this usually means that the image file needs to be added to the test.config file

XML FILE

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<TextView  
android:id="@+id/myLocationText"
android:layout_width="fill_parent" 
android:layout_height="wrap_content" />

 <com.google.android.maps.MapView
 android:id="@+id/myMapView"
 android:layout_height="fill_parent"
 android:layout_width="fill_parent"
 android:clickable="true"
 android:enabled="true"
 android:apiKey="0bBgLl42nWwnTf983Y5VdIgfZI6mC7meL7Ms_qg"/>

</LinearLayout>

Code

public class WhereIam extends MapActivity {
MapController mapController;
MyPositionOverlay positionOverlay;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    MapView myMapView=(MapView)findViewById(R.id.myMapView);
    mapController=myMapView.getController();
    myMapView.setSatellite(true);
    myMapView.setStreetView(true);
    myMapView.displayZoomControls(false);
    myMapView.setBuiltInZoomControls(true);
    mapController.setZoom(16);
    positionOverlay = new MyPositionOverlay();
    List<Overlay> overlays = myMapView.getOverlays();
    overlays.add(positionOverlay);
    LocationManager locationManager;
    String context=Context.LOCATION_SERVICE;
    locationManager=(LocationManager)getSystemService(context);

    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);
    String provider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(provider);

    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
        updateWithNewLocation(location);
        }
        public void onProviderDisabled(String provider){
        updateWithNewLocation(null);
        }
        public void onProviderEnabled(String provider){ }
        public void onStatusChanged(String provider, int status,
        Bundle extras){ }
        };

    updateWithNewLocation(location);
    locationManager.requestLocationUpdates(provider, 2000, 10,
            locationListener);
}

private void updateWithNewLocation(Location location) {
    String latLongString;
    TextView myLocationText;
    String addressString ="No Address Found";
    myLocationText=(TextView)findViewById(R.id.myLocationText);
    if(location!=null)  {
        // Update the map location.
        positionOverlay.setLocation(location);
        Double geoLat = location.getLatitude()*1E6;
        Double geoLng = location.getLongitude()*1E6;
        GeoPoint point = new GeoPoint(geoLat.intValue(),
        geoLng.intValue());
        mapController.animateTo(point);
        double lat=location.getLatitude();
        double lng=location.getLongitude();
        latLongString = "Lat:" + lat + "\nLong:" + lng;
        Geocoder gc=new Geocoder(this, Locale.getDefault());
        try {
            List<Address> addressess= gc.getFromLocation(lat, lng, 1);
            StringBuilder sb=new StringBuilder();
            if(addressess.size()>0) {
                Address address=addressess.get(0);
                for(int i=0;i<address.getMaxAddressLineIndex();i++) {
                    sb.append(address.getAddressLine(i)).append("\n");
                    sb.append(address.getLocality()).append("\n");
                    sb.append(address.getPostalCode()).append("\n");
                    sb.append(address.getCountryName());
                }
                addressString = sb.toString();
            }
        }catch(IOException e) {} 
    }
    else {
        latLongString="No Found Location";
    }
    myLocationText.setText("Your current Location is \n"+latLongString+"\n"+addressString);
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

}

I just crated one api key as follow goto->cmd prompt

change the directory to the keytool folder

now run the command keytool -list -alias androiddebugkey -keystore "C:\Users\pc.android\debug.keystore" -storepass android -keypass android

see the image enter image description here

Now i goto signup page i simply put the MD5 in EditText and checked accept and clicked generate key then following page comes up which show the key--

enter image description here Now i put this key in my MapView Xml file..

as you can see app running fine in emulator but not in real phone.

Where am I going wrong, and how do I generate a second API key for a real phone?

Upvotes: 0

Views: 1258

Answers (2)

Ivan
Ivan

Reputation: 4234

For testing on real hardware you need to use a key different from the debug key. Following your post you are using a debug keystore.

https://developers.google.com/maps/documentation/android-api/v1/?csw=1#getfingerprint

Read that paragraph on google.

Is important that the application is exported as a signed application with the same key used for the google api (and NOT the debug key).

For create a valid read that paragraph:

http://developer.android.com/guide/publishing/app-signing.html#releasemode

and then use the same key to obtain the google maps api key.

Once you have the key for your application you can export a signed application by clicking with right button of your mouse on the project select Android Tools and then Export as a signed application package and follow the wizard (probably you can create a new key using that wizard).

hope that help.

Upvotes: 3

Roman Rdgz
Roman Rdgz

Reputation: 13264

I don't know if it's the same error of "this question", because it shows a white background with a gray grid when the tiles are loading (or they never finish to load when the API key is wrong).

Anyway you are getting the same error in log, so let's go in that direction:

As I self-answered in that question, you must have 2 API keys: one for debug uses at the emulator, and another one for real devices. This last one must be created manually. It can be done from the command prompt or with a Eclipse option.

Once you have created the API key dor real devices, you must create the APK with right-click over the project and export as a signed apk.

Everything is well explained here, and also this question has been made here before, and its solution is well described for Eclipse in accepted answer for this question.

Upvotes: 0

Related Questions