Google Play Services API

  • 8 Antworten
  • Letztes Antwortdatum
D

dboy

Neues Mitglied
0
Hi Leute,

ich versuche im Moment Google Play Services zu integrieren und scheitere dabei recht klanglos. :-(

Habe schon so gut wie jedes dafür verfügbare Tutorial gemacht und am Ende hat einfach nichts funktioniert. Langsam treibt es mich zur Verzweiflung.

Mein kleines erstes Ziel ist es, dass mir eine App einfach nur meine derzeitige Location anzeigt. Dieses soll anhand der Google Play Services API geschehen.

Zuletzt hatte ich folgende Tutorial durchgearbeitet (hoffe der Link geht in Ordnung?):
Integrating Google Play Services on Android - Tuts+ Code Tutorial
Set Up Google Play Services SDK | Android Developers

Kennt ihr vielleicht bessere Tutorials wo wirklich jeder Schritt erklärt wird und am Ende der komplette Code vorhanden ist? Gibt es zu der Thematik vielleicht ein gutes Buch was ich übersehen hatte? Ich kann den Fehler auch nicht wirklich lokalisieren. Beim Testen der App auf dem Nexus 5 wird die Anwendung geschlossen und dabei gibt es folgenden Fehler:

Code:
ddms: Can't bind to local 8600 for debugger
ddmlib: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
java.io.IOException: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen
	at sun.nio.ch.SocketDispatcher.write0(Native Method)
	at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
	at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
	at sun.nio.ch.IOUtil.write(IOUtil.java:65)
	at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:487)
	at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213)
	at com.android.ddmlib.Client.sendAndConsume(Client.java:642)
	at com.android.ddmlib.HandleHeap.sendREAQ(HandleHeap.java:348)
	at com.android.ddmlib.Client.requestAllocationStatus(Client.java:488)
	at com.android.ddmlib.DeviceMonitor.createClient(DeviceMonitor.java:835)
	at com.android.ddmlib.DeviceMonitor.openClient(DeviceMonitor.java:803)
	at com.android.ddmlib.DeviceMonitor.deviceClientMonitorLoop(DeviceMonitor.java:621)
	at com.android.ddmlib.DeviceMonitor.access$100(DeviceMonitor.java:44)
	at com.android.ddmlib.DeviceMonitor$3.run(DeviceMonitor.java:580)

Hier der genutzte Code (denkt euch nix bei dem Namen, kam nur grad zufällig die bescheuerte Werbung im TV):

MainActivity:
Code:
package com.example.imakeyousexydotcom.imysdc;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.*;
import com.google.android.gms.drive.*;

public class MainActivity extends ActionBarActivity
        implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    private GoogleApiClient mGoogleApiClient;
    // Request code to use when launching the resolution activity
    private static final int REQUEST_RESOLVE_ERROR = 1001;
    // Unique tag for the error dialog fragment
    private static final String DIALOG_ERROR = "dialog_error";
    // Bool to track whether the app is already resolving an error
    private boolean mResolvingError = false;

    private static final String STATE_RESOLVING_ERROR = "resolving_error";

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(STATE_RESOLVING_ERROR, mResolvingError);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Start Connection
        // GoogleApiClient.Builder class provides methods that allow you to specify
        // the Google APIs you want to use
        GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        mResolvingError = savedInstanceState != null
                && savedInstanceState.getBoolean(STATE_RESOLVING_ERROR, false);
    }

    @Override
    public void onConnected (Bundle connectionHint){
        // Connected to Google Play services!
        // The good stuff goes here.
    }

    @Override
    public void onConnectionSuspended(int cause) {
        // The connection has been interrupted.
        // Disable any UI components that depend on Google APIs
        // until onConnected() is called.
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (mResolvingError) {
            // Already attempting to resolve an error.
            return;
        } else if (result.hasResolution()) {
            try {
                mResolvingError = true;
                result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
            } catch (IntentSender.SendIntentException e) {
                // There was an error with the resolution intent. Try again.
                mGoogleApiClient.connect();
            }
        } else {
            // Show dialog using GooglePlayServicesUtil.getErrorDialog()
            showErrorDialog(result.getErrorCode());
            mResolvingError = true;
        }
    }

    /* Creates a dialog for an error message */
    private void showErrorDialog(int errorCode) {
        // Create a fragment for the error dialog
        ErrorDialogFragment dialogFragment = new ErrorDialogFragment();
        // Pass the error that should be displayed
        Bundle args = new Bundle();
        args.putInt(DIALOG_ERROR, errorCode);
        dialogFragment.setArguments(args);
        dialogFragment.show(getSupportFragmentManager(), "errordialog");
    }

    /* Called from ErrorDialogFragment when the dialog is dismissed. */
    public void onDialogDismissed() {
        mResolvingError = false;
    }

    /* A fragment to display an error dialog */
    public static class ErrorDialogFragment extends DialogFragment {
        public ErrorDialogFragment() { }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Get the error code and retrieve the appropriate dialog
            int errorCode = this.getArguments().getInt(DIALOG_ERROR);
            return GooglePlayServicesUtil.getErrorDialog(errorCode,
                    this.getActivity(), REQUEST_RESOLVE_ERROR);
        }

        @Override
        public void onDismiss(DialogInterface dialog) {
            ((MainActivity)getActivity()).onDialogDismissed();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_RESOLVE_ERROR) {
            mResolvingError = false;
            if (resultCode == RESULT_OK) {
                // Make sure the app is not already connected or attempting to connect
                if (!mGoogleApiClient.isConnecting() &&
                        !mGoogleApiClient.isConnected()) {
                    mGoogleApiClient.connect();
                }
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (!mResolvingError) {  // more about this later
            mGoogleApiClient.connect();
        }
    }

    @Override
    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Gradle:
Code:
apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.gms:play-services:4.4.52'
}

Manifest:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.imakeyousexydotcom.imysdc" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.imakeyousexydotcom.imysdc.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
</manifest>

Beste Grüße,

dboy
 
Hi,

ich glaube die Fehlermeldung hat nichts direkt mit deinem Code zu tun, sondern mit dem Debugger.
Versuch mal die App ohne Debugger zu starten und schreib mal deine ganze Fehlermeldung hier rein.
 
Hey,

ich habe es nun ohne den Debugger laufen lassen (weiß hier einer was da das Problem war?) und dabei kam dann die folgende Fehlermeldung raus.

Code:
05-23 10:24:21.067  26709-26709/com.example.imakeyousexydotcom.imysdc E/AndroidRuntime FATAL EXCEPTION: main
    Process: com.example.imakeyousexydotcom.imysdc, PID: 26709
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.imakeyousexydotcom.imysdc/com.example.imakeyousexydotcom.imysdc.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.imakeyousexydotcom.imysdc.MainActivity.onStart(MainActivity.java:139)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
            at android.app.Activity.performStart(Activity.java:5241)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
************at android.app.ActivityThread.access$800(ActivityThread.java:135)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:136)
************at android.app.ActivityThread.main(ActivityThread.java:5017)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:515)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
************at dalvik.system.NativeStart.main(Native Method)

Die sagt doch aus, dass kein GoogleApiClient Objekt vorhanden ist auf welches er connecten soll oder? Aber warum?
Ich habe bisher keinen Developer Account angelegt und nichts mit der Google APIs Console gemacht. Ist das notwendig um die App lokal auf dem Handy über Android Studio zu testen? Oder brauch ich diesen Schritt erst, wenn die App wirklich in den Play Store soll?

Beste Grüße,

dboy
 
Hi,

ich glaube schon, dass du irgendeine Art von Authentifizierung brauchst.

Was steht denn in Zeile 139 in der MainActivity.java?
 
Kardroid schrieb:
Hi,

ich glaube schon, dass du irgendeine Art von Authentifizierung brauchst.

Was steht denn in Zeile 139 in der MainActivity.java?

Ah sorry, vergessen zu posten. In der Zeile 139 steht in MainActivity.java

Code:
 mGoogleApiClient.connect();

Und dabei wird ja eine NullPointer geworfen.

Echt gar nicht mal so einfach solch eine API zu integrieren.
 
Hallo dboy,

es könnte auch das Authentifizierungsproblem sein, aber du machst auch was falsch.
Du deklarierst ganze oben den mGoogleApiClient.
private GoogleApiClient mGoogleApiClient;Dann initiierst du ihn aber nochmal intern:

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Drive.API) .addScope(Drive.SCOPE_FILE) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();Hier muss der Klassenname am Anfang weg. (Du kannst auch ein this stattdessen schrieben)
Nur so bekommst du das Objekt auch in die Zeile 139.
Wenn du das geändert hast, schreib bitte die nächste Fehlermeldung hier rein.
 
Hey,

schon einmal vielen Dank für deine Hilfe!
Habe den von dir angesprochenen Fehler behoben und nun startet die App zumindestens schon mal. Es kommt nun die Meldung das ein Fehler mit einem Google Play Dienst vorliegt (in der App als Message).

Hier der Fehlercode

Code:
05-23 15:13:48.397  25247-25247/com.example.imakeyousexydotcom.imysdc E/GooglePlayServicesUtil Internal error occurred. Please see logs for detailed information

Wo finde ich die "logs" um es detaillierter einzusehen? Ich denke es liegt wohl nun an der Authentifizierung mit dem Google Dienst. Ich werde mal schauen ob ich das hin bekomme es dort anzumelden.

Grüße

Der ursprüngliche Beitrag von 15:18 Uhr wurde um 15:59 Uhr ergänzt:

Hmmm irgendwie stehe ich ein wenig auf dem Schlauch bzgl. der Google Developers Console.

Soweit ich es verstanden habe, muss ich in meiner App eine Authentifizierung durchführen bevor ich Google APIs verwenden kann. Dazu gibt es unterschiedliche Wege. Entweder über OAuth 2.0 Token oder durch GoogleApiClient.
GoogleApiClient verwende ich ja in dem geposteten Code. Nur wie Stelle ich da nun eine Authentifizierung sicher? Muss ich diese App bei Google Anmelden? Habe vorher noch nie mit der Google Developers Console gearbeitet (dies hier ist meine erste App). Bei Google ist es leider nicht gerade aussagekräftig erklärt, welche Schritte man befolgen soll.

Daher stellen sich mir die folgenden Fragen:
1) Was muss ich in der Google Developers Console einstellen
2) Was muss ich in der App einstellen

Kennt da jemand vielleicht ein gescheites Tutorial wo schrittweise genau erklärt wird was ich machen muss? Der Service an sich scheint ja soweit nun richtig eingebunden zu sein. Wenn ich nun eine Authentifizierung durchbekomme sollte ich in der Lage sein zu Google Play Diensten zu verbinden und diese in meiner App zu verwenden.

Viele Grüße
 
Hallo dboy,

was möchtest du denn im Google Play Dienst speichern?
Ich kann dir ab jetzt leider nicht mehr weiterhelfen, da ich noch nie den Dienst angebunden habe.
 
Hey,

soweit wie ich es verstanden habe brauche ich die Authentifizierung die Google Play Service API zu verwenden. Diese bietet viele unterschiedliche Möglichkeiten im Bereich Tracking, Achievements, Leaderboards etc. Diese Funktionalitäten würde ich gerne in meine App integrieren und anstatt diese selbst zu realisieren möchte ich hierfür den oben genannten Dienst verwenden.

Danke für deine Hilfe! Hat mich ein Stückchen weitergebracht!

Nun geht es daran den die Authentifizierung zum laufen zu bekommen :)

Grüße

Der ursprüngliche Beitrag von 19:35 Uhr wurde um 20:16 Uhr ergänzt:

Hier ist nochmal ein Video von Android Developers bzgl. der Thematik:
https://www.youtube.com/watch?v=6-F8TjLMQYw
 

Ähnliche Themen

AnnaBauer21
Antworten
14
Aufrufe
1.188
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten