Reputation: 14818
About App:--This is a simple app which find the user current location.
Problem:-- The app works fine on emulator please see the image.
But in phone it is not showing the MapView.Please see the image.
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
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--
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
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
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