Czy otworzyć stronę na Facebooku z aplikacji na Androida?

157

z mojej aplikacji na Androida chciałbym otworzyć link do profilu na Facebooku w oficjalnej aplikacji na Facebooku (oczywiście jeśli aplikacja jest zainstalowana). W przypadku iPhone'a istnieje fb://schemat adresu URL, ale próba tego samego na moim urządzeniu z Androidem powoduje wyświetlenie pliku ActivityNotFoundException.

Czy jest szansa na otwarcie profilu na Facebooku w oficjalnej aplikacji Facebook z kodu?

Björn Marschollek
źródło
2
Jest wątek, na który nie ma odpowiedzi na forach deweloperów na Facebooku: forum.developers.facebook.net/viewtopic.php?pid=255227 (dodając go tutaj, ponieważ pokazuje, że nie ma oczywistej odpowiedzi, a może dostanie odpowiedział tam kiedyś ...)
James Moore
można zobaczyć moją odpowiedź od tutaj .
Mohammad Sommakia

Odpowiedzi:

152

W wersji Facebooka 11.0.0.11.23 (3002850) fb://profile/i fb://page/już nie działa. Rozkompilowałem aplikację Facebook i stwierdziłem, że możesz jej użyć fb://facewebmodal/f?href=[YOUR_FACEBOOK_PAGE]. Oto metoda, której używałem w produkcji:

/**
 * <p>Intent to open the official Facebook app. If the Facebook app is not installed then the
 * default web browser will be used.</p>
 *
 * <p>Example usage:</p>
 *
 * {@code newFacebookIntent(ctx.getPackageManager(), "https://www.facebook.com/JRummyApps");}
 *
 * @param pm
 *     The {@link PackageManager}. You can find this class through {@link
 *     Context#getPackageManager()}.
 * @param url
 *     The full URL to the Facebook page or profile.
 * @return An intent that will open the Facebook page/profile.
 */
public static Intent newFacebookIntent(PackageManager pm, String url) {
  Uri uri = Uri.parse(url);
  try {
    ApplicationInfo applicationInfo = pm.getApplicationInfo("com.facebook.katana", 0);
    if (applicationInfo.enabled) {
      // http://stackoverflow.com/a/24547437/1048340
      uri = Uri.parse("fb://facewebmodal/f?href=" + url);
    }
  } catch (PackageManager.NameNotFoundException ignored) {
  }
  return new Intent(Intent.ACTION_VIEW, uri);
}
Jared Rummler
źródło
4
@DjHacktorReborn nie powinieneś już używać identyfikatorów. Po prostu użyj zwykłego linku.
Jared Rummler,
2
@DjHacktorReborn Właśnie sprawdzone, pracuję tutaj. Na Facebooku w wersji 13.0.0.13.14
Jared Rummler
1
@AbdulWasae Działa w aplikacjach z milionami pobrań. Jeśli masz lepsze rozwiązanie, napisz je zamiast głosowania w dół na działające rozwiązanie.
Jared Rummler
4
czy ktoś może potwierdzić, że to nadal działa? (stan na czerwiec 2019). Nadal dostajęActivityNotFoundException
nVxx
5
Spowoduje to otwarcie strony na Facebooku, ale w przeciwieństwie do zwykłych stron fb, nie widzimy przycisku Lubię to, zdjęć profilowych i okładek itp. Bezpośrednio otwiera Informacje kontaktowe i wyświetla wszystkie posty ze strony.
Neeraj Dwivedi
235

Działa to w najnowszej wersji:

  1. Wejdź na https://graph.facebook.com/ < user_name_here > ( na przykład https://graph.facebook.com/fsintents )
  2. Skopiuj swój identyfikator
  3. Użyj tej metody:

    public static Intent getOpenFacebookIntent(Context context) {
    
       try {
        context.getPackageManager().getPackageInfo("com.facebook.katana", 0);
        return new Intent(Intent.ACTION_VIEW, Uri.parse("fb://page/<id_here>"));
       } catch (Exception e) {
        return new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/<user_name_here>"));
       }
    }

Spowoduje to otwarcie aplikacji Facebook, jeśli użytkownik ją zainstalował. W przeciwnym razie otworzy Facebooka w przeglądarce.

EDYCJA: od wersji 11.0.0.11.23 (3002850) aplikacja Facebook nie obsługuje już tego sposobu, jest inny sposób, sprawdź odpowiedź poniżej Jareda Rummlera.

joaomgcd
źródło
1
Dzięki za to, bardzo mi pomogło! Gdyby tylko był sposób na zrobienie tego na Twitterze
Evan R.
3
Lista schematów adresów URL dostępnych na iOS znajduje się na wiki.akosma.com/IPhone_URL_Schemes - niektóre z nich powinny działać również na Androidzie
FrancescoR
7
i tutaj jest odpowiedź na ten problem; użyj „strony” zamiast profilu - stackoverflow.com/a/15872383/1433187
Khobaib
1
Wystarczy zauważyć, że fb: // profile / NIE jest obsługiwany w aplikacji Facebook w wersji 1.3.2, która jest dostępna w magazynie Nexus One 2.3.6
Mark
3
DjHacktorReborn ma rację, ani fb: // profile / <fpid>, ani fb: // page / <fpid> już nie działają, począwszy od fb v11
sam
38

Czy to nie jest łatwiejsze? Na przykład w onClickListener?

try {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/426253597411506"));
    startActivity(intent);
} catch(Exception e) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/appetizerandroid")));
}

PS. Uzyskaj swój identyfikator (dużą liczbę) ze strony http://graph.facebook.com/[userName]

Jan
źródło
Zgadzam się, to jest lepsze, ponieważ nie przyjmuje żadnych założeń dotyczących nazwy pakietu aplikacji Facebook ani filtrów intencji. Jednak jest gorzej z tego samego powodu, ponieważ inne aplikacje mogą również określać pasujące filtry intencji. To zależy od tego, czego chcesz. Może dodaj, że zrobisz intent.setPackageName („com.facebook.katana”), aby upewnić się, że żadne inne aplikacje nie są wywoływane.
Mark
Ale otwiera przeglądarkę i są wyświetlane dane z Facebooka, jak można użyć aplikacji Facebook (aby zadzwonić do aplikacji Facebook)?
Mikheil Zhghenti
32

W przypadku strony na Facebooku:

try {
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://page/" + pageId));
} catch (Exception e) {
    intent =  new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + pageId));
}

Dla profilu na Facebooku:

try {
    intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/" + profileId));
} catch (Exception e) {
    intent =  new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + profileId));
}

... ponieważ żadna z odpowiedzi nie wskazuje na różnicę

Oba przetestowano z Facebookiem w wersji 27.0.0.24.15 i Androidem 5.0.1 na Nexusie 4

Murmel
źródło
cześć, po czym poznać różnicę między profilem a stroną?
alvarodoune
1
Profil jest dla osoby prywatnej, gdzie strona jest dla firm, miejsc, marek. Zobacz: facebook.com/help/217671661585622 [Tytuł: Czym różnią się strony od profili osobistych?]
Murmel
dla notatek: intent = new Intent (Intent.ACTION_VIEW, Uri.parse ("fb: // note /" + facebookNoteId));
voodoo98
1
Aby znaleźć identyfikator strony publicznej, wydarzenia, profilu możesz użyć FindMyFbId
Carlos Zerga Stycznia
Profil nie otwiera się w aplikacji Facebook.
Hammad Nasir
27

Oto sposób na zrobienie tego w 2016 roku, działa świetnie i jest bardzo łatwy.

Odkryłem to po sprawdzeniu, jak e-maile wysyłane przez Facebooka otwierają aplikację.

// e.g. if your URL is https://www.facebook.com/EXAMPLE_PAGE, you should put EXAMPLE_PAGE at the end of this URL, after the ?
String YourPageURL = "https://www.facebook.com/n/?YOUR_PAGE_NAME";
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(YourPageURL));

startActivity(browserIntent);
Someguy123
źródło
1
Działa doskonale, nawet w 2016 roku. Rozwiązuje również problem podczas przeglądania Facebooka z Belgii (kiedy pliki cookie są wyłączone, gdy nie jesteś zalogowany).
wątpliwość
3
Kiedy tego używam, w aplikacji Facebooka brakuje nagłówka strony na Facebooku, do której się odwołuję, np. Obrazu profilu strony i zakładek Strona / Aktywność / Statystyki.
Daniel Persson,
Działa to, jeśli masz nazwę strony (jak podano), ale nie, jeśli masz numeryczny identyfikator strony.
Eric B.,
5
Ok, ale nie prowadzi mnie do czystej strony, na której użytkownik może łatwo polubić moją stronę ... Wciąż tego szukam! Jakieś rozwiązanie?
Regis_AG
ktoś ma rozwiązanie dla @Regis_AG?
adrianvintu,
22

to jest najprostszy kod, który to robi

public final void launchFacebook() {
        final String urlFb = "fb://page/"+yourpageid;
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(urlFb));

        // If a Facebook app is installed, use it. Otherwise, launch
        // a browser
        final PackageManager packageManager = getPackageManager();
        List<ResolveInfo> list =
            packageManager.queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
        if (list.size() == 0) {
            final String urlBrowser = "https://www.facebook.com/"+pageid;
            intent.setData(Uri.parse(urlBrowser));
        }

        startActivity(intent);
    }
MBH
źródło
to nie działa. kiedy ustawiam link „ facebook.com/pages/"+pageid
BSKANIA,
Pomiń „pages /” - część -> użyj „facebook.com/” + pageId
Murmel
nadal działa jak dzisiaj! bardzo dziękuję, zmieniłem tę część "" facebook.com/pages/"+pageid ; " tym jednym „” facebook.com/"+pageid ; ”
naitbrahim
@naitbrahim Dziękujemy za poinformowanie nas, że nadal działa! Poprawiłem odpowiedź. btw, odpowiedź została wysłana w 2013 roku :) Szczęśliwy, że ci pomogło
MBH
15

Podejście bardziej wielokrotnego użytku.

Jest to funkcja, której zwykle używamy w większości naszych aplikacji. Stąd tutaj jest fragment kodu wielokrotnego użytku, aby to osiągnąć.

(Podobnie jak w przypadku innych odpowiedzi dotyczących faktów. Opublikuj je tutaj, aby uprościć i umożliwić ponowne wykorzystanie implementacji)

"fb://page/nie działa z nowszymi wersjami aplikacji FB. Powinieneś użyć fb://facewebmodal/f?href=dla nowszych wersji. ( Jak wspomniano w innej odpowiedzi tutaj )

To jest pełnoprawny działający kod, który obecnie znajduje się w jednej z moich aplikacji:

public static String FACEBOOK_URL = "https://www.facebook.com/YourPageName";
public static String FACEBOOK_PAGE_ID = "YourPageName";

//method to get the right URL to use in the intent
public String getFacebookPageURL(Context context) {
        PackageManager packageManager = context.getPackageManager();
        try {
            int versionCode = packageManager.getPackageInfo("com.facebook.katana", 0).versionCode;
            if (versionCode >= 3002850) { //newer versions of fb app
                return "fb://facewebmodal/f?href=" + FACEBOOK_URL;
            } else { //older versions of fb app
                return "fb://page/" + FACEBOOK_PAGE_ID;
            }
        } catch (PackageManager.NameNotFoundException e) {
            return FACEBOOK_URL; //normal web url
        }
    }

Ta metoda zwróci prawidłowy adres URL aplikacji, jeśli jest zainstalowana, lub adres internetowy, jeśli aplikacja nie jest zainstalowana.

Następnie rozpocznij intencję w następujący sposób:

Intent facebookIntent = new Intent(Intent.ACTION_VIEW);
String facebookUrl = getFacebookPageURL(this);
facebookIntent.setData(Uri.parse(facebookUrl));
startActivity(facebookIntent);

To wszystko, czego potrzebujesz.

AndroidMechanic - Viral Patel
źródło
Wyrzucił „android.content.ActivityNotFoundException: Nie znaleziono działania obsługującego zamiar {act = android.intent.action.VIEW dat = fb: // page / ####}”
Rajbir Shienh
9

Zostało to odtworzone przez Pierre87 na forum FrAndroid , ale nie mogę znaleźć żadnego oficjalnego opisu, który by to opisał, więc musi być traktowany jako nieudokumentowany i może przestać działać w dowolnym momencie:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName("com.facebook.katana", "com.facebook.katana.ProfileTabHostActivity");
intent.putExtra("extra_user_id", "123456789l");
this.startActivity(intent);
Jon Colverson
źródło
Tak, rozwiązanie przestało działać. Błąd to: „java.lang.SecurityException ?: Permission Denial: running Intent {flg = 0x10080000 cmp = com.facebook.katana / .ProfileTabHostActivity? (Has extras)} from ProcessRecord?”. Activity ProfileTabHostActivity nie ma flagi android: exported w pliku AndroidManifest, więc domyślnie android: exported = "false" dla tego działania. W rezultacie ProfileTabHostActivity nie może być uruchamiane przez inne aplikacje. Jedyna nadzieja, że ​​programiści FB naprawią ten problem w wersjach funkcji aplikacji FB.
dvpublic
Myślę, że rozwiązaniem było zamknięcie tego „przypadkowego API”.
Vaiden
7

wypróbuj ten kod:

String facebookUrl = "https://www.facebook.com/<id_here>";
        try {
            int versionCode = getPackageManager().getPackageInfo("com.facebook.katana", 0).versionCode;
            if (versionCode >= 3002850) {
                Uri uri = Uri.parse("fb://facewebmodal/f?href=" + facebookUrl);
                   startActivity(new Intent(Intent.ACTION_VIEW, uri));
            } else {
                Uri uri = Uri.parse("fb://page/<id_here>");
                startActivity(new Intent(Intent.ACTION_VIEW, uri));
            }
        } catch (PackageManager.NameNotFoundException e) {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(facebookUrl)));
        }
Ravi Makvana
źródło
7

Aby to zrobić, potrzebujemy „identyfikatora strony na Facebooku”, możesz go pobrać:

  • ze strony przejdź do „O mnie”.
  • przejdź do sekcji „Więcej informacji”.

introducir la descripción de la imagen aquí

Aby otworzyć aplikację Facebook na określonej stronie profilu,

możesz to zrobić:

 String facebookId = "fb://page/<Facebook Page ID>";
  startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(facebookId)));

Możesz też sprawdzić, czy aplikacja Facebook nie jest zainstalowana, a następnie otworzyć stronę internetową na Facebooku.

String facebookId = "fb://page/<Facebook Page ID>";
String urlPage = "http://www.facebook.com/mypage";

     try {
          startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(facebookId )));
        } catch (Exception e) {
         Log.e(TAG, "Application not intalled.");
         //Open url web page.
         startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        }
Jorgesys
źródło
Nie widziałem tego Page IDna karcie Informacje. To jest prywatne?
RoCk RoCk
5

Po wielu testach znalazłem jedno z najbardziej skutecznych rozwiązań:

private void openFacebookApp() {
    String facebookUrl = "www.facebook.com/XXXXXXXXXX";
    String facebookID = "XXXXXXXXX";

    try {
        int versionCode = getActivity().getApplicationContext().getPackageManager().getPackageInfo("com.facebook.katana", 0).versionCode;

        if(!facebookID.isEmpty()) {
            // open the Facebook app using facebookID (fb://profile/facebookID or fb://page/facebookID)
            Uri uri = Uri.parse("fb://page/" + facebookID);
            startActivity(new Intent(Intent.ACTION_VIEW, uri));
        } else if (versionCode >= 3002850 && !facebookUrl.isEmpty()) {
            // open Facebook app using facebook url
            Uri uri = Uri.parse("fb://facewebmodal/f?href=" + facebookUrl);
            startActivity(new Intent(Intent.ACTION_VIEW, uri));
        } else {
            // Facebook is not installed. Open the browser
            Uri uri = Uri.parse(facebookUrl);
            startActivity(new Intent(Intent.ACTION_VIEW, uri));
        }
    } catch (PackageManager.NameNotFoundException e) {
        // Facebook is not installed. Open the browser
        Uri uri = Uri.parse(facebookUrl);
        startActivity(new Intent(Intent.ACTION_VIEW, uri));
    }
}
Javier Amor Penas
źródło
4

Moja odpowiedź opiera się na szeroko akceptowanej odpowiedzi od joaomgcd. Jeśli użytkownik ma zainstalowany Facebook, ale jest wyłączony (na przykład przy użyciu kwarantanny aplikacji), ta metoda nie zadziała. Zamiar aplikacji Twitter zostanie wybrany, ale nie będzie mógł go przetworzyć, ponieważ jest wyłączony.

Zamiast:

context.getPackageManager().getPackageInfo("com.facebook.katana", 0);
return new Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/620681997952698"));

Możesz skorzystać z następujących opcji, aby zdecydować, co zrobić:

PackageInfo info = context.getPackageManager().getPackageInfo("com.facebook.katana", 0);
if(info.applicationInfo.enabled)
    return new Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/620681997952698"));
else
    return new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/620681997952698"));
igordc
źródło
4

Najlepsza odpowiedź, jaką znalazłem, działa świetnie.

Po prostu przejdź do swojej strony na Facebooku w przeglądarce, kliknij prawym przyciskiem myszy i kliknij „Wyświetl kod źródłowy”, a następnie znajdź page_idatrybut: musisz użyć page_idtutaj w tym wierszu po ostatnim ukośniku:

fb://page/pageID

Na przykład:

Intent facebookAppIntent;
try {
    facebookAppIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://page/1883727135173361"));
    startActivity(facebookAppIntent);
} catch (ActivityNotFoundException e) {
    facebookAppIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://facebook.com/CryOut-RadioTv-1883727135173361"));
    startActivity(facebookAppIntent);
}
Shahid Ahmad
źródło
Ma to sens tylko w przypadku aplikacji statycznych.
Irshu
4

Od marca 2020 działa to doskonale.

private void openFacebookPage(String pageId) {
    String pageUrl = "https://www.facebook.com/" + pageId;

    try {
        ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo("com.facebook.katana", 0);

        if (applicationInfo.enabled) {
            int versionCode = getPackageManager().getPackageInfo("com.facebook.katana", 0).versionCode;
            String url;

            if (versionCode >= 3002850) {
                url = "fb://facewebmodal/f?href=" + pageUrl;
            } else {
                url = "fb://page/" + pageId;
            }

            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        } else {
            throw new Exception("Facebook is disabled");
        }
    } catch (Exception e) {
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(pageUrl)));
    }
}
DeveScie
źródło
2
Intent intent = null;
    try {
        getPackageManager().getPackageInfo("com.facebook.katana", 0);
        String url = "https://www.facebook.com/"+idFacebook;
        intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://facewebmodal/f?href="+url));
    } catch (Exception e) {
        // no Facebook app, revert to browser
        String url = "https://facebook.com/"+idFacebook;
        intent = new Intent(Intent.ACTION_VIEW);
        intent .setData(Uri.parse(url));
    }
    this.startActivity(intent);
Programista Tiger
źródło
2

Od lipca 2018 działa to doskonale z aplikacją Facebook lub bez niej na wszystkich urządzeniach.

private void goToFacebook() {
    try {
        String facebookUrl = getFacebookPageURL();
        Intent facebookIntent = new Intent(Intent.ACTION_VIEW);
        facebookIntent.setData(Uri.parse(facebookUrl));
        startActivity(facebookIntent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private String getFacebookPageURL() {
    String FACEBOOK_URL = "https://www.facebook.com/Yourpage-1548219792xxxxxx/";
    String facebookurl = null;

    try {
        PackageManager packageManager = getPackageManager();

        if (packageManager != null) {
            Intent activated = packageManager.getLaunchIntentForPackage("com.facebook.katana");

            if (activated != null) {
                int versionCode = packageManager.getPackageInfo("com.facebook.katana", 0).versionCode;

                if (versionCode >= 3002850) {
                    facebookurl = "fb://page/1548219792xxxxxx";
                }
            } else {
                facebookurl = FACEBOOK_URL;
            }
        } else {
            facebookurl = FACEBOOK_URL;
        }
    } catch (Exception e) {
        facebookurl = FACEBOOK_URL;
    }
    return facebookurl;
}
Immy
źródło
Aplikacja FB Lite ma oddzielną nazwę pakietu, jeśli używasz w ten sposób, powinieneś również sprawdzić com.facebook.lite - chociaż nie sprawdzałem, czy Lite obsłuży te adresy URL
androidguy
@androidguy Nie mam FB Lite. Dobrze byłoby wiedzieć, czy kod z nim współpracuje. Gdybyś mógł to jakoś przetestować i umieścić tutaj swoje odkrycia, pomogłoby to innym, którzy nadal tu przyjeżdżają. Doceniane, dzięki
Immy
@Immy -> Yourpage-1548219792xxxxxx w adresie URL to identyfikator strony lub adres URL strony. Na przykład: facebook.com/PageName to adres URL mojej strony, a identyfikator to coś w rodzaju 2345676. Czyli adres URL, który należy wspomnieć w kodzie, to facebook.com/PageName czy coś innego?
Neeraj Dwivedi
@NeerajDwivedi Potrzebujesz obu: nazwy strony i identyfikatora strony w adresie URL. Coś takiego: 'String FACEBOOK_URL = " facebook.com/BeanRoaster-1548219792112345/" ;'
Immy,
@Immy Użyłem dokładnie tego samego kodu, zastępując adres FACEBOOK_URL na „ facebook.com/myPageName-myPageID ” i otrzymuję pustą stronę z paskiem wyszukiwania na górze. Używam najnowszej aplikacji Facebooka na Androida 9 (wersja aplikacji Fb - 237.0.0.44.120)
Neeraj Dwivedi
1

Stworzyłem metodę otwierania strony na Facebooku w aplikacji na Facebooku, jeśli aplikacja nie istnieje, otwieranie w chrome

    String socailLink="https://www.facebook.com/kfc";
    Intent intent = new Intent(Intent.ACTION_VIEW);
    String facebookUrl = Utils.getFacebookUrl(getActivity(), socailLink);
    if (facebookUrl == null || facebookUrl.length() == 0) {
        Log.d("facebook Url", " is coming as " + facebookUrl);
        return;
    }
    intent.setData(Uri.parse(facebookUrl));
    startActivity(intent);

Utils.class dodaje te metody

public static String getFacebookUrl(FragmentActivity activity, String facebook_url) {
    if (activity == null || activity.isFinishing()) return null;

    PackageManager packageManager = activity.getPackageManager();
    try {
        int versionCode = packageManager.getPackageInfo("com.facebook.katana", 0).versionCode;
        if (versionCode >= 3002850) { //newer versions of fb app
            Log.d("facebook api", "new");
            return "fb://facewebmodal/f?href=" + facebook_url;
        } else { //older versions of fb app
            Log.d("facebook api", "old");
            return "fb://page/" + splitUrl(activity, facebook_url);
        }
    } catch (PackageManager.NameNotFoundException e) {
        Log.d("facebook api", "exception");
        return facebook_url; //normal web url
    }
}

i to

 /***
 * this method used to get the facebook profile name only , this method split domain into two part index 0 contains https://www.facebook.com and index 1 contains after / part
 * @param context contain context
 * @param url contains facebook url like https://www.facebook.com/kfc
 * @return if it successfully split then return "kfc"
 *
 * if exception in splitting then return "https://www.facebook.com/kfc"
 *
 */
 public static String splitUrl(Context context, String url) {
    if (context == null) return null;
    Log.d("Split string: ", url + " ");
    try {
        String splittedUrl[] = url.split(".com/");
        Log.d("Split string: ", splittedUrl[1] + " ");
        return splittedUrl.length == 2 ? splittedUrl[1] : url;
    } catch (Exception ex) {
        return url;
    }
}
Abdul Rizwan
źródło
3
W najnowszej wersji prowadzi mnie to do strony Informacje, podczas gdy chcę przejść do strony głównej. Jakieś wskazówki ?
Balaji Katika
Znalazłeś rozwiązanie?
Aman Verma
1

Aby uruchomić stronę na Facebooku z Twojej aplikacji, pozwól urlString = "fb: // page / your_fb_page_id"

Aby uruchomić komunikator na Facebooku, pozwól urlString = "fb-messenger: // user / your_fb_page_id"

Identyfikator strony FB jest zwykle numeryczny. Aby go uzyskać, przejdź do funkcji Znajdź mój identyfikator FB, wprowadź adres URL swojego profilu, na przykład www.facebook.com/edgedevstudio, a następnie kliknij „Znajdź numeryczny identyfikator”.

Voila, masz teraz swój numeryczny identyfikator fb. zamień „your_fb_page_id” na wygenerowany numeryczny identyfikator

 val intent = Intent(Intent.ACTION_VIEW, Uri.parse(urlString))
 if (intent.resolveActivity(packageManager) != null) //check if app is available to handle the implicit intent
 startActivity(intent)
EdgeDev
źródło
1

Zadeklaruj stałe

  private String FACEBOOK_URL="https://www.facebook.com/approids";
    private String FACEBOOK_PAGE_ID="approids";

Zadeklaruj metodę

public String getFacebookPageURL(Context context) {
        PackageManager packageManager = context.getPackageManager();
        try {
            int versionCode = packageManager.getPackageInfo("com.facebook.katana", 0).versionCode;

            boolean activated =  packageManager.getApplicationInfo("com.facebook.katana", 0).enabled;
            if(activated){
                if ((versionCode >= 3002850)) {
                    Log.d("main","fb first url");
                    return "fb://facewebmodal/f?href=" + FACEBOOK_URL;
                } else {
                    return "fb://page/" + FACEBOOK_PAGE_ID;
                }
            }else{
                return FACEBOOK_URL;
            }
        } catch (PackageManager.NameNotFoundException e) {
            return FACEBOOK_URL;
        }
    }

Funkcja połączenia

Intent facebookIntent = new Intent(Intent.ACTION_VIEW);
                String facebookUrl = getFacebookPageURL(MainActivity.this);
                facebookIntent.setData(Uri.parse(facebookUrl));
                startActivity(facebookIntent);
Abhishek Agarwal
źródło
0

Odpowiadam w październiku 2018 r. Działający kod to ten, który używa identyfikatora strony. Właśnie go przetestowałem i działa.

public static void openUrl(Context ctx, String url){
    Uri uri = Uri.parse(url);
    if (url.contains(("facebook"))){
        try {
            ApplicationInfo applicationInfo = ctx.getPackageManager().getApplicationInfo("com.facebook.katana", 0);
            if (applicationInfo.enabled) {
                uri = Uri.parse("fb://page/<page_id>");
                openURI(ctx, uri);
                return;
            }
        } catch (PackageManager.NameNotFoundException ignored) {
            openURI(ctx, uri);
            return;
        }
    }
franzesz
źródło
0

Zaimplementowałem w tej formie w webview używając fragment- inside oncreate:

 webView.setWebViewClient(new WebViewClient()
{
    public boolean shouldOverrideUrlLoading(WebView viewx, String urlx)
                {
     if(Uri.parse(urlx).getHost().endsWith("facebook.com")) {
                        {
                            goToFacebook();
                        }
                        return false;
                    }
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlx));
                    viewx.getContext().startActivity(intent);
                    return true;
                }

});

i na zewnątrz onCreateView:

 private void goToFacebook() {
        try {
            String facebookUrl = getFacebookPageURL();
            Intent facebookIntent = new Intent(Intent.ACTION_VIEW);
            facebookIntent.setData(Uri.parse(facebookUrl));
            startActivity(facebookIntent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //facebook url load
    private String getFacebookPageURL() {
        String FACEBOOK_URL = "https://www.facebook.com/pg/XXpagenameXX/";
        String facebookurl = null;

        try {
            PackageManager packageManager = getActivity().getPackageManager();

            if (packageManager != null) {
                Intent activated = packageManager.getLaunchIntentForPackage("com.facebook.katana");

                if (activated != null) {
                    int versionCode = packageManager.getPackageInfo("com.facebook.katana", 0).versionCode;

                    if (versionCode >= 3002850) {
                        facebookurl = "fb://page/XXXXXXpage_id";
                    }
                } else {
                    facebookurl = FACEBOOK_URL;
                }
            } else {
                facebookurl = FACEBOOK_URL;
            }
        } catch (Exception e) {
            facebookurl = FACEBOOK_URL;
        }
        return facebookurl;
    }
silvertech048
źródło
0

otwórz fb po kliknięciu przycisku bez użycia facebook sdk

 Intent FBIntent = new Intent(Intent.ACTION_SEND);
    FBIntent.setType("text/plain");
    FBIntent.setPackage("com.facebook.katana");
    FBIntent.putExtra(Intent.EXTRA_TEXT, "The text you wanted to share");
    try {
        context.startActivity(FBIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(context, "Facebook have not been installed.", Toast.LENGTH_SHORT).show( );
    }
Drashti Vyas
źródło
0
fun getOpenFacebookIntent(context: Context, url: String) {
    return try {
        context.packageManager.getPackageInfo("com.facebook.katana", 0)
        context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("fb://profile/$url/")))
    } catch (e: Exception) {
        context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
}
Hardik Patel
źródło
0

1-aby uzyskać identyfikator, przejdź do profilu obrazu i kliknij prawym przyciskiem myszy i skopiuj adres linku.

        try {
                Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("fb://profile/id"));
                startActivity(intent);
            } catch(Exception e) {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("facebook url")));
            }
        }
    });
mohamed gemy
źródło
-1
try {
       String[] parts = url.split("//www.facebook.com/profile.php?id=");
       getPackageManager().getPackageInfo("com.facebook.katana", 0);
       startActivity(new Intent (Intent.ACTION_VIEW, Uri.parse(String.format("fb://page/%s", parts[1].trim()))));
    } catch (Exception e) {
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    }
Jan
źródło
-2

Możesz otworzyć aplikację Facebook po kliknięciu przycisku w następujący sposób: -

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    this.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            startNewActivity("com.facebook.katana");
        }
    });

}

public void startNewActivity( String packageName)
{
    Intent intent = MainActivity.this.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent != null)
    {
        // we found the activity
        // now start the activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
    else
    {
        // bring user to the market
        // or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse("market://details?id="+packageName));
        startActivity(intent);
    }
}
Deepak Sharma
źródło