Freitag, 5. September 2014

Mein erstes Mal: Mit einer Android App bei Facebook Erfolge teilen

Zumindest die Schmarlspurvariante zum Punkte-Twittern bei einem Spiel auf Android-Basis war ja mal recht einfach. Facebook ist schon anspruchsvoller, bis man was Brauchbares vorliegen hat.

Unbrauchbare Kurzversion:
@Override
public void onClick(View v) {
  String uri = "fb://feed";
  Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
  startActivity(intent);
}

fb://feed ruft die "Neuigkeiten" in der Facebook-App auf. Offenbar gibt es einen ganzen Stall von unterstützten Aufrufen, aber keiner unterstützt einen neuen Feed oder das Teilen von Informationen.

Ähnlich unbrauchbar ist der folgende Code, der der immerhin prüft, ob die Facebook-App bereits installiert ist. Längere unbrauchbare Kurzversion:
@Override
public void onClick(View v) {
  Intent intent = GameActivity.this.getPackageManager()
      .getLaunchIntentForPackage("com.facebook.katana");

  if (intent != null) {
    startActivity(intent);
  } else {
    intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri
      .parse("market://details?id=com.facebook.katana"));
    startActivity(intent);
  }
}

Auch hier finde ich keine Möglichkeit zur Erzeugung eines neuen Feeds oder Teilen inklusive Datenübergabe. Offenbar hilft nur die Verwendung des Facebook SDKs.

Bevor man in die lustige Welt der reichlichen Codezeilen eintauchen kann, muss man sich als Facebook Developer registrieren ...


... und verifizieren ...


Geschafft:


Danach muss man eine neue App erzeugen:


Habe ich schon mal erwähnt, dass ich Captchas "toll" finde? Vor allem die, die man nicht entschlüsseln kann ... der Buchstabe nach dem F (?) ist ein WAS?


Nach Captcha-Wechsel und -Eingabe ist es geschafft:


Die APP ID ist die ID, die man der App übergeben muss, damit die Facebook-App das Abschicken des Posts akzeptiert. Dies geschieht im AndroidManifest.xml im <application>-Knoten:
<application android:label="@string/app_name" .../>
  <activity android:label="@string/app_name" .../>
    <intent-filter>
      <action android:name="android...MAIN" />
      <category android:name="android...LAUNCHER" />
    </intent-filter>
  </activity>
  <activity android:name="...GameActivity" .../>
  [...]
  <meta-data android:name="com.facebook.sdk.ApplicationId"
     android:value="@string/app_id"/>
</application>

Der Wert muss natürlich noch entsprechend in der strings.xml abgelegt werden:
<string name="app_id">4xxxxxxxxxxxxx9</string>

Über "Add Platform" wird Facebook noch die ausführende Activity bekannt gemacht:


Neben package- und Activity-Name will Facebook noch einen Key Hash haben, den man der entsprechenden Activity in der onCreate-Methode mit folgendem Code entlocken kann:
try {
  PackageInfo info = getPackageManager().getPackageInfo(
      "com.facebook.samples.hellofacebook",
      PackageManager.GET_SIGNATURES);
  for (Signature signature : info.signatures) {
    MessageDigest md = MessageDigest.getInstance("SHA");
    md.update(signature.toByteArray());
    Log.d("KeyHash:",
      Base64.encodeToString(md.digest(), Base64.DEFAULT));
  }
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}

Geht nicht? Dann fehlt wohl noch die fulminante Facebook-Library!

Um mit der ganzen Facebook-Geschichte warm zu werden, stellt Facebook einige Beispiel-Apps zur Verfügung. HIER zu finden.

Nach dem Import in Eclipse freut man sich über viele tolle neue Projekte (wenn man - wie ich - vergessen hat, etwas abzuwählen) und das FacebookSDK.


Dieses SDK muss in facebookverwendende Apps unter Properties - Android - Library eingebunden werden. Hier dümpelt oft appcompat_v7 herum. Das FacebookSDK mochte die Anwesenheit der anderen Library zumindest in meinem Eclipse nicht so wirklich, weswegen ich appcompat_v7 an dieser Stelle entfernt habe. Ich hatte in diesem Moment das Glück, dass meine App es sowieso nicht braucht.


Nachdem es jetzt auch mit dem Key Hash klappt, ist eigentlich alles da, um einen neuen Facebook-Share-Aufruf zu entwickeln! Eine Dokumentation der gesamten Komponenten des FacebookSDKs findet man hier findet man übrigens HIER.

Da es für den FacebookDialog.ShareDialogBuilder ein Beispiel gab, habe ich das Ding einfach mal zweckentfremdet. Mit folgendem Code ist man dabei:
private void postFacebookFeed(int score) {
  // share dialog is supported
  if (facebookShareDialogSupported) {
    FacebookDialog shareDialog 
     = new FacebookDialog.ShareDialogBuilder(this)
      .setName("M......s-Name")
      .setCaption("M......s-Caption"
      .setDescription("M......s-Description")
      .setPicture(
        "http://morgaine1976.fun2code.de/XLTooth1.png")
      .setLink(
        "http://morgaine1976.blogspot.de/search/label/m......s")
      .build();

    uiHelper.trackPendingDialogCall(shareDialog.present());
  }
}

Auf dem Handy sieht das so aus:


Man sieht, dass nicht alle per Code gesetzten Werte verwendet werden, es fehlen setCaption() und setLink():


Die sieht man erst nach dem Abschicken:


Wenn man übrigens das setPicture() weg lässt, dann wird das Bild vom Link genommen. Im Fall des Links auf meinen Blog sieht das so aus:


Noch ein paar Hintergrundinfos zu dem Code oben:

facebookShareDialogSupported wird in der onCreate()-Methode zugewiesen:
facebookShareDialogSupported = FacebookDialog.canPresentShareDialog(
this, FacebookDialog.ShareDialogFeature.SHARE_DIALOG);

und prüft, ob der "Teilen Dialog" in der aktuell installierten Version der Facebook-App unterstützt wird.

Der uiHelper ist ein UiLifecycleHelper, der in der onCreate()-Methode erzeugt wird.

Den gesamten Code möchte ich hier nicht zur Verfügung stellen, da ich das Beispiel aus dem HelloFacebookSample auf ein Minimum zusammengestrichen habe und noch nicht weiß, ob das trotzdem noch in allen Lebenslagen fehlerfrei läuft :)

So geht es mit Twitter (Light-Version).

Nachtrag vom 8.9.: Ein paar Regeln sollte man beim Erstellen des Facebook-Knopfes berücksichtigen. Und die Farben dazu gibt es HIER!

Keine Kommentare:

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.