Подтвердить что ты не робот

Android: Как поделиться изображением с текстом на facebook через намерение?

Я хотел бы поделиться фотографией с заголовком, предварительно заполненным из моего приложения, с помощью намерения поделиться, на facebook.

Пример кода

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");      

intent.putExtra(Intent.EXTRA_TEXT, "eample");
intent.putExtra(Intent.EXTRA_TITLE, "example");
intent.putExtra(Intent.EXTRA_SUBJECT, "example");
intent.putExtra(Intent.EXTRA_STREAM, imageUri);

Intent openInChooser = new Intent(intent);
openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
startActivity(openInChooser);

Вот скриншот, который я получаю

Text is not display

Если заданный тип изображения /*, то фотография загружается без предварительно заполненного текста. Если набор для текстовой/простой фотографии не отображается.....

4b9b3361

Ответ 1

Новейшие версии Facebook не позволяют вам делиться текстом, используя намерения. Вы должны использовать Facebook SDK, чтобы сделать это - чтобы сделать это простым, используйте Facebook SDK + Android Simple Facebook (https://github.com/sromku/android-simple-facebook). Используя библиотеку, ваш код будет выглядеть так (извлечено с сайта Simple Facebook):

Опубликовать канал

Установите OnPublishListener и вызовите:

  • publish(Feed, OnPublishListener) без диалога.
  • publish(Feed, true, OnPublishListener) с диалоговым окном.

Основные свойства

  • message - сообщение пользователя
  • name - название вложения ссылки
  • caption - заголовок ссылки (появляется под названием ссылки)
  • description - описание ссылки (появляется под заголовком ссылки)
  • picture - URL картинки, прикрепленной к этому сообщению. Картинка должна быть не менее 200 на 200 пикселей
  • link - ссылка, прикрепленная к этому сообщению

Инициализировать обработчик обратного вызова:

OnPublishListener onPublishListener = new OnPublishListener() {
    @Override
        public void onComplete(String postId) {
            Log.i(TAG, "Published successfully. The new post id = " + postId);
        }

     /* 
      * You can override other methods here: 
      * onThinking(), onFail(String reason), onException(Throwable throwable)
      */
};

Построить фид:

Feed feed = new Feed.Builder()
    .setMessage("Clone it out...")
    .setName("Simple Facebook for Android")
    .setCaption("Code less, do the same.")
    .setDescription("The Simple Facebook library project makes the life much easier by coding less code for being able to login, publish feeds and open graph stories, invite friends and more.")
    .setPicture("https://raw.github.com/sromku/android-simple-facebook/master/Refs/android_facebook_sdk_logo.png")
    .setLink("https://github.com/sromku/android-simple-facebook")
    .build();

Опубликовать ленту без диалога:

mSimpleFacebook.publish(feed, onPublishListener);

Опубликовать ленту с диалогом:

mSimpleFacebook.publish(feed, true, onPublishListener);


Обновление от 14 декабря 2015 г.


в соответствии с новым Facebook SDK.

facebook-андроид-SDK: 4.6.0

Это очень просто.
1. создать провайдера в Android.manifest.xml

<provider
            android:authorities="com.facebook.app.FacebookContentProvider{APP_ID}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true" />

2. Создайте свой общий ресурс с данными.

ShareHashtag shareHashTag = new ShareHashtag.Builder().setHashtag("#YOUR_HASHTAG").build();
ShareLinkContent shareLinkContent = new ShareLinkContent.Builder()
                .setShareHashtag(shareHashTag)
                .setQuote("Your Description")
                .setContentUrl(Uri.parse("image or logo [if playstore or app store url then no need of this image url]"))
                .build();


3. Показать диалог Поделиться

ShareDialog.show(ShowNavigationActivity.this,shareLinkContent);


Это.

Ответ 2

Попробуйте с этим

private void initShareIntent(String type,String _text){
     File filePath = getFileStreamPath("shareimage.jpg");  //optional //internal storage
     Intent shareIntent = new Intent();
     shareIntent.setAction(Intent.ACTION_SEND);
     shareIntent.putExtra(Intent.EXTRA_TEXT, _text);
     shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(new File(filePath)));  //optional//use this when you want to send an image
     shareIntent.setType("image/jpeg");
     shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
     startActivity(Intent.createChooser(shareIntent, "send"));
}

Ответ 3

Начиная с 2017 года, facebook не позволяет совместно использовать изображение + текст непосредственно из вашего приложения.

Обход

Facebook, тем не менее, очистит URL-адрес для данных заголовка и изображения и будет использовать его в сообщении общего доступа.

В качестве обходного пути вы можете создать одностраничное приложение *, которое динамически загружает текст/изображение, которое вы хотите разделить (указано в URL-адресе), и вы можете facebook-поделиться этим URL-адресом.

Примечания:

  • Убедитесь, что ваше одностраничное приложение создает статическую страницу с названием, открытыми метатегами и изображениями, установленными перед очисткой страницы facebook. Если эти теги веб-страниц динамически изменяются с помощью Javascript, facebook не сможет очистить эти значения и использовать их в своем сообщении общего доступа.
  • Использовать открытые метатеги свойств метаданных og: image: height и og: image: width, чтобы facebook для создания предварительного просмотра отправить сообщение

Действия

0) добавьте последнюю библиотеку facebook-sdk в файл build.gradle

compile group: 'com.facebook.android', name: 'facebook-android-sdk', version: '4.25.0'

1) В вашем AndroidManifest.xml добавьте тег метаданных в ваш раздел <application>:

<application android:label="@string/app_name" ...>
...
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
...
</application>

Добавьте строку facebook_app_id (с вашим APP ID) в файл strings.xml:

<string name="facebook_app_id">12341234</string>

YOURFBAPPID - ваш идентификатор вашего Facebook, найденный на https://developers.facebook.com/apps/

2) также добавьте тег <provider> вне вашего тега <application> в AndroidManifest.xml

<provider android:authorities="com.facebook.app.FacebookContentProviderYOURFBAPPID"
          android:name="com.facebook.FacebookContentProvider"
          android:exported="true"/>

3) Создайте объект ShareLinkContent с помощью своего конструктора:

ShareLinkContent fbShare = new ShareLinkContent.Builder()
            .setContentUrl(Uri.parse("http://yourdomain.com/your-title-here/someimagefilename"))
            .build();

4) Поделитесь им с вашим фрагментом (или активностью и т.д.):

ShareDialog.show(getActivity(), fbShare);

Документы Facebook

https://developers.facebook.com/docs/android/getting-started

Ответ 4

FB больше не позволяет предварительно заполнять сообщение общего доступа.

Чтобы обойти это, вам нужно будет использовать SDK для публикации через запрос Графа. Для этого вам понадобится разрешение publish_actions. Начиная с прошлого месяца вам нужно отправить ваше приложение в процесс просмотра, чтобы получить доступ к publish_actions. Который вы потерпите неудачу, если ваше приложение будет заполнять тексты обмена. Поверьте мне, я попробовал Chutzppah.

Итак, похоже, что мы должны были выполнить.

B.t.w. в iOS вы все еще можете заполнять тексты с помощью FB sdk. Кто знает, как долго.

Ответ 5

Без использования Facebook sdk мы не можем совместно использовать изображение и текст одновременно на facebook. Чтобы решить эту проблему, я создал растровое изображение изображения и текста. Поделитесь этим растровым изображением на facebook, и он отлично работает.

Вы можете скачать исходный код здесь (Поделиться изображением и текстом на facebook с использованием намерения в android)

Вот код:

MainActivity.java

package com.shareimage;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements 
View.OnClickListener {
EditText et_text;
ImageView iv_image;
TextView tv_share,tv_text;
RelativeLayout rl_main;


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

    init();

}

private void init(){
    et_text = (EditText)findViewById(R.id.et_text);
    iv_image = (ImageView)findViewById(R.id.iv_image);
    tv_share = (TextView)findViewById(R.id.tv_share);
    rl_main = (RelativeLayout)findViewById(R.id.rl_main);
    tv_text= (TextView) findViewById(R.id.tv_text);

    File dir = new File("/sdcard/Testing/");
    try {
        if (dir.mkdir()) {
            System.out.println("Directory created");
        } else {
            System.out.println("Directory is not created");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    tv_share.setOnClickListener(this);

    et_text.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            tv_text.setText(et_text.getText().toString());

        }
    });


}




@Override
public void onClick(View v) {

    switch (v.getId()){
        case R.id.tv_share:
            Bitmap bitmap1 = loadBitmapFromView(rl_main, rl_main.getWidth(), rl_main.getHeight());
            saveBitmap(bitmap1);
            String str_screenshot = "/sdcard/Testing/"+"testing" + ".jpg";

            fn_share(str_screenshot);
            break;
    }

}

public void saveBitmap(Bitmap bitmap) {
    File imagePath = new File("/sdcard/Testing/"+"testing" + ".jpg");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();

        Log.e("ImageSave", "Saveimage");
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }
}

public static Bitmap loadBitmapFromView(View v, int width, int height) {
    Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    v.draw(c);

    return b;
}

public void fn_share(String path) {

    File file = new File("/mnt/" + path);

    Bitmap bmp = BitmapFactory.decodeFile(file.getAbsolutePath());
    Uri uri = Uri.fromFile(file);
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_STREAM, uri);

    startActivity(Intent.createChooser(intent, "Share Image"));


}

}

Ответ 6

Добавьте эти строки в следующий код

shareCaptionIntent.putExtra(Intent.EXTRA_TITLE, "my awesome caption in the EXTRA_TITLE field");

Ответ 7

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);

   shareIntent.setType("image/*");

   shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (String) v.getTag(R.string.app_name));

   shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); // put your image URI

   PackageManager pm = v.getContext().getPackageManager();

   List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);

     for (final ResolveInfo app : activityList) 
     {
         if ((app.activityInfo.name).contains("facebook")) 
         {

           final ActivityInfo activity = app.activityInfo;

           final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);

          shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);

          shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

          shareIntent.setComponent(name);

          v.getContext().startActivity(shareIntent);

          break;
        }
      }