Android FB API 3.0 – Berechtigungen nur einmal festlegen

Ich versuche herauszufinden, wie neue API funktioniert, also habe ich es geschafft, das Konzept zu verstehen, und es geschafft, meine eigene "Hallo Welt" zu machen, die sich bei Facebook anmelden, abmelden und versuchen, das Bild hochzuladen.

Jetzt in HelloFacebookSample und SessionLoginSimple gibt es eine einfache Anmeldung zu facebook und im HelloFacebookSample, wenn du auf "Post photo" klickst, erscheint ein neuer Dialog für die Anmeldung, da die Berechtigungen nicht gesetzt sind.

  • Android - Gmail-Anhang mit meiner App öffnen
  • So deaktivieren / aktivieren Sie alle Kinder auf LinearLayout in Android
  • ListView-Header ignoriert Layout_height
  • Einbetten von Anzeigen auf Android App?
  • Deaktivieren und Aktivieren von Orientierungsänderungen in einer Aktivität in Android programmgesteuert
  • Android NDK - unterstützt es gerade ARM Code oder einfach nur Thumb
  • Dies ist der Code von HelloFacebookSample:

    private void performPublish(PendingAction action) { Session session = Session.getActiveSession(); if (session != null) { pendingAction = action; if (session.getPermissions().contains("publish_actions")) { // We can do the action right away. handlePendingAction(); } else { // We need to reauthorize, then complete the action when we get called back. Session.ReauthorizeRequest reauthRequest = new Session.ReauthorizeRequest(this, PERMISSIONS). setRequestCode(REAUTHORIZE_ACTIVITY). setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); session.reauthorizeForPublish(reauthRequest); } } } 

    So wie wir nicht "publish_actions" haben, müssen wir reauthorisieren.

    In SimpleSessionLogin-Login sieht das so aus:

     private void onClickLogin() { Session session = Session.getActiveSession(); if (!session.isOpened() && !session.isClosed()) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); } else { Session.openActiveSession(this, true, statusCallback); } } 

    Also, ich kann nicht herausfinden, wie man Berechtigungen während der Anmeldung anfordert. Es ist nett ein komisches oder zu sagen, redundant, um sich in den Service zweimal in wenigen Sekunden mit genau dem gleichen Dialog anmelden.

    Es kann dem Benutzer klingen, dass etwas falsch oder komisch ist.

    Ich möchte mich bei facebook einmal anmelden, mit erwünschten Berechtigungen, aber mit API 3.0 Session Anrufe, nicht die veraltete.

    Kann jemand bitte erklären, wie?

  • Android kann meine onClick-Methode nicht finden
  • Nutzen von der Verwendung von Parcelable anstelle von Serialisierungsobjekt
  • Edittext verkleinert sich im Querformat, wenn Softkeyboard erscheint
  • Wie kann ich den inaktiven Speicher in Android programmgesteuert löschen?
  • Wie vermeidet man mehrere Instanzen derselben Aktivität?
  • Wie füge ich hinzu -Xlint: unchecked zu meinem Android Gradle-basierten Projekt?
  • 5 Solutions collect form web for “Android FB API 3.0 – Berechtigungen nur einmal festlegen”

    Die Session.OpenRequest verfügt über eine Methode, in der Sie Berechtigungen festlegen können. Doch mit dem 3.0 SDK fordert Facebook nun, dass Entwickler die Berechtigungen "lesen" und "veröffentlichen" separat anfordern. Also, wenn Ihre App muss sowohl lesen Benutzer Info und veröffentlichen in ihrem Namen, dann müssen Sie reauthorize aufrufen.

    Ok, hier ist ein Dialog-Fragment, das ich gemacht habe, das Facebook's 3.0 SDK für Android verwendet. Es ist eingekapselt, was bedeutet, dass alle Facebook-Funktionalität im Fragment enthalten ist. Dies ist ein Dialog-Fragment, so dass es über Ihre laufende Aktivität auftaucht. Dieses Fragment lässt Sie sich anmelden, dann ermöglicht es Ihnen, bestimmte Ansichten zu erfassen, sobald Sie sich mit der mit Facebook gelieferten UiHelper-Klasse angemeldet haben.

     public class FFragment extends DialogFragment { private static final String TAG = "FacebookFragment"; private UiLifecycleHelper uiHelper; private String mFilePath; private Button shareButton, cancelButton; private EditText mMessageText; private TextView mMessageTitle; private ProgressBar pBar; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.facebook_login, container, false); LoginButton authButton = (LoginButton) view .findViewById(R.id.authButton); authButton.setFragment(this); authButton.setPublishPermissions(Arrays.asList("publish_stream")); shareButton = (Button) view.findViewById(R.id.shareButton); mMessageText = (EditText) view.findViewById(R.id.facebook_post_text); mMessageTitle = (TextView) view.findViewById(R.id.facebook_post_title); cancelButton = (Button) view.findViewById(R.id.cancelButton); pBar = (ProgressBar) view.findViewById(R.id.facebook_pbar); cancelButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { FFragment.this.dismiss(); } }); shareButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { publishPhoto(); } }); return view; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFilePath = getArguments().getString("file_path"); uiHelper = new UiLifecycleHelper(getActivity(), callback); uiHelper.onCreate(savedInstanceState); } /** * After user selects to upload photo */ private void publishPhoto() { pBar.setVisibility(View.VISIBLE); GraphObject graphObject; Bitmap bmap = BitmapFactory.decodeFile(mFilePath); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] byteArray = stream.toByteArray(); Bundle params = new Bundle(); params.putByteArray("picture", byteArray); params.putString("message", mMessageText.getText() + " " + getActivity().getResources().getString("String goes here")); Request request = new Request(Session.getActiveSession(), "me/photos",params, HttpMethod.POST); request.setCallback(new Request.Callback() { @Override public void onCompleted(Response response) { if (response.getError()==null) { Toast.makeText(getActivity(), "Successfully posted photo", Toast.LENGTH_SHORT).show(); FlurryAgent.logEvent(Globals.EVENT_FACEBOOK); } else { Toast.makeText(getActivity(), response.getError().getErrorMessage(), Toast.LENGTH_SHORT).show(); } pBar.setVisibility(View.GONE); FFragment.this.dismiss(); } }); request.executeAsync(); } private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state.isOpened()) { Log.i(TAG, "Logged in..."); // Check for reading user_photos permission shareButton.setVisibility(View.VISIBLE); mMessageText.setVisibility(View.VISIBLE); mMessageTitle.setVisibility(View.VISIBLE); } else if (state.isClosed()) { Log.i(TAG, "Logged out..."); shareButton.setVisibility(View.GONE); mMessageText.setVisibility(View.GONE); mMessageTitle.setVisibility(View.GONE); } } private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; @Override public void onResume() { super.onResume(); uiHelper.onResume(); // For scenarios where the main activity is launched and user // session is not null, the session state change notification // may not be triggered. Trigger it if it's open/closed. Session session = Session.getActiveSession(); if (session != null && (session.isOpened() || session.isClosed())) { onSessionStateChange(session, session.getState(), null); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); } @Override public void onPause() { super.onPause(); uiHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); uiHelper.onSaveInstanceState(outState); } 

    }

    Die folgenden Codezeilen sind das, was du in deiner Aktivität verwenden würdest, um den Dialog zu zeigen.

     FFragment mFacebookFragment = new FFragment(); Bundle args = new Bundle(); args.putString("file_path", mFilePath); mFacebookFragment.setArguments(args); mFacebookFragment.show(getSupportFragmentManager(), "tag"); 

    Jedenfalls, wenn du auf dem onCreate schaust, sind wir Einstellungen die Publish Berechtigungen. Standardmäßig sind die Leseberechtigungen bereits gesetzt, wenn das Fragment gestartet wird.

    Auch machst du das im Manifest.

     <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> 

    Wo @ string / app_id ist die App-ID, die Sie gemacht haben, wenn erstellt facbeook Anwendung auf Entwickler Website. Achten Sie auch darauf, das neue sdk facebook-Projekt herunterzuladen und als Bibliotheksprojekt zu verweisen. XML-Datei für das Dialoglayout.

      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" > <com.facebook.widget.LoginButton android:id="@+id/authButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_gravity="center_horizontal|top" /> <TextView android:id="@+id/facebook_post_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="Message to post with photo" android:textColor="@android:color/white" android:textSize="18dp" android:textStyle="bold" android:visibility="gone" /> <EditText android:id="@+id/facebook_post_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:minLines="3" android:visibility="gone" /> <Button android:id="@+id/shareButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center" android:text="Post" android:textStyle="bold" android:visibility="gone" /> <Button android:id="@+id/cancelButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Cancel" android:textStyle="bold" /> </LinearLayout> <ProgressBar android:id="@+id/facebook_pbar" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:visibility="gone" /> 

    Bei der erstmaligen Autorisierung / Anmeldung in der App können Sie nur Leseberechtigungen anfordern. Ich habe dieses neue SDK schon früher ausprobiert und war auch leicht verwirrt.

    Facebook möchte, dass der Benutzer mehr Vertrauen in die App-Fähigkeiten Ihrer App ist, indem er es so macht, dass Sie für die Veröffentlichung von Berechtigungen zum ersten Mal, wenn Sie eine OG-Aktion veröffentlichen möchten, neu autorisieren. Wenn du auf den Weg schaust, wie Foursquare oder Instagram OG veröffentlicht, haben sie ein Facebook-Kontrollkästchen oder eine Schaltfläche, um anzuzeigen, dass du die Aktion auf FB teilen willst. Sie können etwas ähnliches implementieren oder was ich am Ende tat, ist, eine Schaltfläche anzuzeigen, nachdem der Benutzer die App autorisiert hat, die sie bittet, um zu klicken, um Veröffentlichungsaktionen auf Facebook zu aktivieren.

    Die Facebook 3.0 api ist wirklich beschränkend mit nicht in der Lage zu fragen, sowohl lesen und veröffentlichen zur gleichen Zeit. Ich habe zwar einen Workaround gefunden, aber du musst die Bibliothek ändern.

    Füge einfach zu Session.java hinzu:

     public final void openForReadAndPublish(OpenRequest openRequest) { open(openRequest, null); } 

    Dies führt dazu, dass es die Validierungsprüfungen überspringt, die Ausnahmen auslösen. Natürlich musst du jetzt alles noch manueller machen. Sie könnten auch nur kommentieren die validatePermissions (openRequest, authType) Anrufe in Session und das sollte es so, dass Sie in alle Berechtigungen übergeben können, die Sie wollen.

    @Ming Li, Als ich eine Sitzung mit erstellt

     public static final List<String> ALL_PERMISSIONS = Arrays.asList( "read_friendlists", "publish_stream", "offline_access", "email", "read_stream", "user_location" ); session.openForPublish(new Session.OpenRequest(this).setPermissions(ALL_PERMISSIONS).setCallback(statusCallback).setRequestCode(100)); 

    Die erhaltene Sitzung hat sowohl die (gelesenen und veröffentlichenden) Berechtigungen. So fühle ich Benutzer, die Session mit lesen möchten, sowohl lesen als auch publish können openForPublish () api verwenden. Es klappt…!!

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.