Открыть страницу Facebook из приложения Android? - PullRequest
148 голосов
/ 27 января 2011

из моего приложения для Android, я хотел бы открыть ссылку на профиль Facebook в официальном приложении Facebook (если приложение, конечно, установлено).Для iPhone существует схема URL fb://, но при попытке выполнить то же самое на моем устройстве Android выдается ActivityNotFoundException.

. Есть ли шанс открыть профиль Facebook в официальном приложении Facebook из кода?

Ответы [ 23 ]

232 голосов
/ 18 апреля 2012

Это работает в последней версии:

  1. Перейдите на https://graph.facebook.com/> (например, https://graph.facebook.com/fsintents)
  2. Скопируйте свой идентификатор
  3. Используйте этот метод:

    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>"));
       }
    }
    

Откроется приложение Facebook, если оно установлено пользователем.В противном случае он откроет Facebook в браузере.

РЕДАКТИРОВАТЬ: начиная с версии 11.0.0.11.23 (3002850) Приложение Facebook больше не поддерживает этот способ, есть другой способ, проверьте ответ ниже от Джареда Раммлера.1020 *

138 голосов
/ 03 июля 2014

В Facebook версии 11.0.0.11.23 (3002850) fb://profile/ и fb://page/ больше не работают.Я декомпилировал приложение Facebook и обнаружил, что вы можете использовать fb://facewebmodal/f?href=[YOUR_FACEBOOK_PAGE].Вот метод, который я использовал в производстве:

/**
 * <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);
}
36 голосов
/ 25 июня 2013

Разве это не проще? Например, внутри 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. Получите ваш идентификатор (большое число) от http://graph.facebook.com/[userName]

30 голосов
/ 19 февраля 2015

Для страницы Facebook:

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));
}

Для профиля Facebook:

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));
}

... потому что ни один из ответов не указывает на разницу

Оба протестированы сFacebook v.27.0.0.24.15 и Android 5.0.1 на Nexus 4

27 голосов
/ 15 мая 2016

Вот способ сделать это в 2016 году, он отлично работает и очень прост.

Я обнаружил это после изучения того, как письма, отправленные с помощью Facebook, открывали приложение.

// 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);
21 голосов
/ 21 мая 2013

это самый простой код для этого

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/pages/"+pageid;
            intent.setData(Uri.parse(urlBrowser));
        }

        startActivity(intent);
    }
15 голосов
/ 02 января 2016

Более пригодный для повторного использования подход.

Это функциональность, которую мы обычно используем в большинстве наших приложений. Следовательно, здесь есть многократно используемый код для достижения этой цели.

(Аналогично другим ответам в терминах фактов. Размещать его здесь просто для упрощения и повторного использования реализации)

"fb://page/ не работает с более новыми версиями приложения FB. Вы должны использовать fb://facewebmodal/f?href= для более новых версий. ( Как упомянуто в другом ответе здесь )

Это полноценный рабочий код, который в настоящее время находится в одном из моих приложений:

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
        }
    }

Этот метод возвращает правильный URL-адрес для приложения, если оно установлено, или веб-URL, если приложение не установлено.

Затем начните намерение следующим образом:

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

Это все, что вам нужно.

10 голосов
/ 25 октября 2017

"fb://page/ не работает с более новыми версиями приложения FB.Вы должны использовать fb://facewebmodal/f?href= для более новых версий.

Это полноценный рабочий код:

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
        }
    }

Этот метод вернет правильный URL-адрес для приложения, если оно установлено, или веб-URL, если приложение установлено.не установлен.

Затем запустите намерение следующим образом:

Intent facebookIntent = new Intent(Intent.ACTION_VIEW);
String facebookUrl = getFacebookPageURL(this);
facebookIntent.setData(Uri.parse(facebookUrl));
startActivity(facebookIntent);
9 голосов
/ 27 января 2011

Это был обратный инжиниринг Pierre87 на форуме FrAndroid , но я не могу найти нигде официального, который описывает это, так что это должно рассматриваться как недокументированное и может перестать работать в любой момент:

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);
7 голосов
/ 23 января 2015

попробуйте этот код:

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)));
        }
...