Wie kann ich einen Google-Maps-API-Schlüssel für andere App verwenden ?

  • Antworten:6
Wicki11
  • Forum-Beiträge: 103

21.02.2017, 12:47:25 via Website

Hallo,
Ich nutze Android-Studio 2.2.2 und habe eine App, die Google-Maps-API zur Anzeige einer Karte benutzt.
Dafür wurden import-Anweisungen (import com.google.android.gms.maps....)
generiert. Ein entsprechender API-Schlüssel wurde erzeugt. Die App funktioniert.

Nun habe ich eine zweite Anwendung (mit anderem Package-name), in der imports der Art
import com.google.android.maps.... verwendet werden für Klassen wie MapController, GeoPoint u.a..

Fragen:
Was muss ich machen, damit diese Klassen in die Anwendung eingebunden werden ?
Wie wie kann ich obigen API-Schlüssel in die neue Anwendung integrieren
oder brauche ich dazu einen neuen API-Schlüssel ?
Muss ich die neue Anwendung explizit signieren ?
Brauche ich in der neuen Anwendung eine Datei google_maps_api.xml wie in obiger App ?

Bitte um Hilfe !
Gruß Wicki

Antworten
swa00
  • Forum-Beiträge: 3.704

21.02.2017, 12:54:44 via Website

Hallo Wicki,

Ich muss gestehen , dass ich nicht so ganz verstanden habe , wo du das Problem hast.

Wenn es geht , würde ich für jedes veröffentliche Package einen gesonderten API Schlüssel verwenden.
Wenn nur ein Schlüssel an deinen Account geknüpft ist , dann kannst du den Gleichen verwenden.

Was muss ich machen, damit diese Klassen in die Anwendung eingebunden werden ?

Bezieht sich Deine Frage auf die dependencies ?? (Gradle)

Muss ich die neue Anwendung explizit signieren ?

Bezieht sich die Signierung auf die öffentliche Release - Version ?

— geändert am 21.02.2017, 13:01:16

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Wicki11
  • Forum-Beiträge: 103

22.02.2017, 17:03:06 via Website

Dank für Deine Antwort.
Das mit dem API-Schlüssel hat sich nun geklärt. Es geht hier nur um Debug-Versionen und ich möchte den einen Schlüssel für unterschiedliche App's benutzen.
Ich habe nun den Code eines Beispielprojekts, der aber wahrscheinlich auf Google-Maps-API v1 beruht. Diesen Code möchte ich in einem neuen Projekt benutzen.
Dieses habe ich angelegt nach den Empfehlungen von Google developers.
Allerdings werden da Klassen wie MapController, GeoPoint u.a.. nicht erkannt.
Ich habe dann ein File maps.jar von Google ins libs-Verzeichnis des Projekts gestellt. Dieses enthält all die fehlenden Klassen, so dass das App-Build funktionierte. Doch die App stürzt dann ab mit folgenden Meldungen:
02-22 16:47:07.977 5325-5325/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{j8map.jung.mymapviewactivity/j8map.jung.mymapviewactivity.MapViewActivity}: java.lang.RuntimeException: stub
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2016)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
at android.app.ActivityThread.access$700(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: stub
at com.google.android.maps.MapActivity.(Unknown Source)
at j8map.jung.mymapviewactivity.MapViewActivity.(MapViewActivity.java:0)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2007)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117) 
at android.app.ActivityThread.access$700(ActivityThread.java:134) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4867) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
at dalvik.system.NativeStart.main(Native Method) 

Antworten
swa00
  • Forum-Beiträge: 3.704

22.02.2017, 17:19:52 via Website

Hallo Wicki,

Ich habe dann ein File maps.jar von Google ins libs-Verzeichnis des Projekts gestellt

Warum bindest du ein jar ein und verwendest nicht den Standard, die Services über Gradle einzubinden ?
Deine Vorgehensweise ist ein wenig "ungewöhnlich"

— geändert am 22.02.2017, 17:21:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Wicki11
  • Forum-Beiträge: 103

22.02.2017, 18:33:05 via Website

mein build.gradle enthält folgendes:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.google.android.gms:play-services-maps:10.2.0'
testCompile 'junit:junit:4.12'
}

also genau die standardmäßigen Services, aber in denen gibt es die erwähnten Klassen nicht. Deshalb habe ich das jar-File eingebunden.
Vielleicht mal hier ein Codeausschnitt:

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import java.util.List;
import java.util.Locale;

public class MapViewActivity extends MapActivity {
private MapController mapController;
private MapView mapView;
private GeoPoint geoPoint;
private MyItemizedOverlay myItemizedOverlay;
private Drawable drawable;
private OverlayItem overlayItem;
private List mapOverlays;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Eine Referenz auf das MapView-Widget definieren
mapView = (MapView)findViewById(R.id.mapview);

Gruß Wicki

Antworten
swa00
  • Forum-Beiträge: 3.704

22.02.2017, 19:54:19 via Website

Hallo Wicki,

das ist richtig , aber du benötigst dann keine Maps.jar mehr .

private MapView mapView; sollte dann schon eingebunden sein.

Nimm mal die jar heraus, führe ein neues Sync & Clean & Rebuild durch.
Entferne dann deine imports und lasse Diese mit ALT+ Enter neu setzen

P.S Deine play-services-maps-10.2.0.aar befindet sich im übrigen schon unter
C:\Users[USER]\AppData\Local\Android\sdk\extras\google\m2repository\com\google\android\gms\play-services-maps\10.2.0

— geändert am 23.02.2017, 06:42:35

Liebe Grüße - Stefan
[ App - Entwicklung ]

Wicki11

Antworten
Wicki11
  • Forum-Beiträge: 103

23.02.2017, 12:54:01 via Website

Nimm mal die jar heraus, führe ein neues Sync & Clean & Rebuild durch.
Entferne dann deine imports und lasse Diese mit ALT+ Enter neu setzen

habe ich alles gemacht, die MapView wurde per ALT+Enter erkannt, aber für MapActivity,MapController,OverlayItem wurde nichts angeboten.

Hier nochmal die komplette Activity:

package j8map.jung.mymapviewactivity;

import android.graphics.drawable.Drawable;
import android.location.Geocoder;
import android.os.Bundle;

import com.google.android.gms.maps.MapView;

import java.util.List;
import java.util.Locale;

/*
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
*/

public class MapViewActivity extends MapActivity {
private MapController mapController;
private MapView mapView;
private GeoPoint geoPoint;
private MyItemizedOverlay myItemizedOverlay; //eigene Nutzerklasse
private Drawable drawable;
private OverlayItem overlayItem;
private List mapOverlays;

private final String TAG = MapViewActivity.class.getSimpleName();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapview);
mapOverlays = mapView.getOverlays();
drawable = this.getResources().
getDrawable(R.drawable.t1);
myItemizedOverlay = new MyItemizedOverlay(drawable, this);
// Eine MapController-Instanz ermitteln, um den anzuzeigenden
// Kartenausschnitt auf einen bestimmten Punkt zu positionieren
// und den Zoomfaktor festzulegen
mapController = mapView.getController();
Geocoder geo = new Geocoder(getApplicationContext(), Locale.GERMANY);
geoPoint = new GeoPoint((int)(50.110555 * 1E6),(int)(8.682222 * 1E6));
mapController.animateTo(geoPoint);
overlayItem = new OverlayItem(geoPoint, "Hallo", "Hier bin ich zu Hause");
myItemizedOverlay.addOverlay(overlayItem);
mapOverlays.add(myItemizedOverlay);
mapController.setZoom(10);
// Eine Karte kann auf unterschiedliche Weise angezeigt werden;
// als Satellitenbild oder als Stra?enansicht (der Standard)
mapView.setStreetView(true);
mapView.setBuiltInZoomControls(true);
}
// Auch die Methode isRouteDisplayed() der Oberklasse MapActivity
// muss implementiert werden; diese teilt Google mit, wie die
// Maps benutzt werden sollen; werden diese zur Anzeige von
// Reiserouten benutzt, sollte die Methode true zur?ckgeben
@Override
protected boolean isRouteDisplayed() {
return false;
}
}

und die build.gradle:

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "j8map.jung.mymapviewactivity"
minSdkVersion 14
targetSdkVersion 16
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.google.android.gms:play-services-maps:10.2.0'
testCompile 'junit:junit:4.12'
}

Gruß Wicki

Abschließende Bemerkung:
Die fehlenden Klassen gehören zum Maps-API v1 und sind in v2 nicht mehr enthalten. Ich habe inzwischen das Problem mit Mitteln von Maps-API v2 gelöst.

— geändert am 26.02.2017, 19:02:03

Antworten