facebook的Android共享意图-共享文本和链接
Posted
技术标签:
【中文标题】facebook的Android共享意图-共享文本和链接【英文标题】:Android share intent for facebook- share text AND link 【发布时间】:2012-02-04 23:30:06 【问题描述】:我正在尝试使用 android 分享意图在 facebook 上发布一些内容。它看起来像这样:
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Free education for all! http://linkd.in/xU8mCc");
startActivity(shareIntent);
所以我的帖子既有文字又有链接。但是当消息发布在facebook上时,它只有链接,没有消息。我尝试了各种附加功能,但没有任何效果。
有人遇到过这个问题并解决了吗?我有 facebook 应用程序版本 1.8.1
编辑:我尝试删除链接,但 facebook 应用程序没有接收我的消息(显示要发布的空白消息),但反之则不然。所以看起来该应用程序完全忽略了任何纯文本消息。我吓坏了!这是FB应用程序中根本无法发布短信(具有共享意图)的主要错误吗?
【问题讨论】:
你好 GreenBee 我也有同样的问题,但是这个链接现在打不开here is my Question请帮我解决这个问题 这是我的解决方案,仅用于共享 URL,***.com/a/29529335/513413 【参考方案1】:我刚刚构建了这段代码,它对我有用:
private void shareAppLinkViaFacebook(String urlToShare)
try
Intent intent1 = new Intent();
intent1.setClassName("com.facebook.katana", "com.facebook.katana.activity.composer.ImplicitShareIntentHandler");
intent1.setAction("android.intent.action.SEND");
intent1.setType("text/plain");
intent1.putExtra("android.intent.extra.TEXT", urlToShare);
startActivity(intent1);
catch (Exception e)
// If we failed (not native FB app installed), try share through SEND
String sharerUrl = "https://www.facebook.com/sharer/sharer.php?u=" + urlToShare;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(sharerUrl));
startActivity(intent);
【讨论】:
似乎 try 功能不起作用,虽然我的设备上安装了 Facebook 应用,但 catch 工作正常。 这里的消息在哪里? intent1.setPackage("com.facebook.katana");使用它而不是 intent1.setClassName("com.facebook.katana", "com.facebook.katana.activity.composer.ImplicitShareIntentHandler");【参考方案2】:如果您打算使用常规的 Android 分享意图,那么不幸的是,Facebook 分享意图只能采用一个 URL(确保它有 http://),并且没有额外的文本消息。这是一个奇怪的限制,实际上没有任何意义。
您必须在项目中使用实际的官方单独的 Facebook Android SDK 才能获得完整的共享功能。这是额外的工作。
我遇到了类似的问题。最后,我所做的是分支意图。如果他们选择通过 Facebook 分享(在常规的 android 分享意图中),请创建一个只有 URL 的新分享意图并将其推送到 Facebook。所有其他共享选项(推特、消息、电子邮件)都可以正常工作。
我的问题和解决方案在这里:
Branching the Android Share Intent extras depending on which method they choose to share
String shareBody = "app string text " + act_txt + " more text! Get the app at http://www.appurl.com";
PackageManager pm = view.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
for(final ResolveInfo app : activityList)
Log.i(TAG, "app.actinfo.name: " + app.activityInfo.name);
//if((app.activityInfo.name).contains("facebook"))
if("com.facebook.katana.ShareLinkActivity".equals(app.activityInfo.name))
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "http://www.appurl.com");
startActivity(Intent.createChooser(sharingIntent, "Share idea"));
break;
else
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "app name");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
startActivity(Intent.createChooser(sharingIntent, "Share"));
break;
【讨论】:
感谢您的想法。但是为什么你总是在for
循环中使用break
?【参考方案3】:
在 Lollipop (21) 中,您可以使用 Intent.EXTRA_REPLACEMENT_EXTRAS
覆盖特定应用的意图。
https://developer.android.com/reference/android/content/Intent.html#EXTRA_REPLACEMENT_EXTRAS
private void doShareLink(String text, String link)
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
Intent chooserIntent = Intent.createChooser(shareIntent, getString(R.string.share_via));
// for 21+, we can use EXTRA_REPLACEMENT_EXTRAS to support the specific case of Facebook
// (only supports a link)
// >=21: facebook=link, other=text+link
// <=20: all=link
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
shareIntent.putExtra(Intent.EXTRA_TEXT, text + " " + link);
Bundle facebookBundle = new Bundle();
facebookBundle.putString(Intent.EXTRA_TEXT, link);
Bundle replacement = new Bundle();
replacement.putBundle("com.facebook.katana", facebookBundle);
chooserIntent.putExtra(Intent.EXTRA_REPLACEMENT_EXTRAS, replacement);
else
shareIntent.putExtra(Intent.EXTRA_TEXT, link);
chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(chooserIntent);
【讨论】:
【参考方案4】:在我的应用程序中,我集成了 Facebook SDK 以使用户能够在他们的墙上分享报价 [预填充文本]。使用 FB SDK,可以做到这一点。它适用于我的应用,我有超过 5000 名用户使用它。
显然这不违反 FB 的政策,因为我没有收到任何警告或问题,这不起作用。
同样的代码sn-ps可以在这里找到,
Do any widely used Android apps have Facebook sharing with pre-populated text field?
【讨论】:
【参考方案5】:使用此代码在 facebook 上分享图片、视频、链接和文本完美运行
public class Shareonwall extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener
JSONObject response, profile_pic_data, profile_pic_url;
TextView user_name, user_email;
ImageView user_picture;
NavigationView navigation_view;
CallbackManager callbackManager;
ShareDialog shareDialog;
int REQUEST_CAMERA = 0, SELECT_FILE = 1;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;
// public static TextView output;
private static final int MY_PERMISSIONS_REQUEST_CAMERA = 110;
private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 222;
private static final int MY_PERMISSIONS_REQUEST_CAMERA_VIDEO = 333;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
facebookSDKInitialize();
setContentView(R.layout.activity_details);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
Button button = (Button) findViewById(R.id.button);
Button imageShare = (Button) findViewById(R.id.imageShare);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("Home Page");
Intent intent = getIntent();
String jsondata = intent.getStringExtra("jsondata");
setNavigationHeader(); // call setNavigationHeader Method.
setUserProfile(jsondata); // call setUserProfile Method.
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
shareDialog = new ShareDialog(this); // intialize facebook shareDialog.
navigation_view.setNavigationItemSelectedListener(this);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
if (ShareDialog.canShow(ShareLinkContent.class))
ShareLinkContent linkContent = new ShareLinkContent.Builder()
.setContentTitle("How to integrate Facebook from your app")
.setImageUrl(Uri.parse("http://www.devglan.com/image/dashboard.jpg"))
.setContentDescription(
"simple Fb Image share integration")
.setContentUrl(Uri.parse("http://www.devglan.com/image/dashboard.jpg"))
.build();
shareDialog.show(linkContent); // Show facebook ShareDialog
);
imageShare.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
selectImage();
);
// this method is for create a dialog box to choose options to select Image to share on facebook.
private void selectImage()
final CharSequence[] items = "Take Photo", "Choose from Library","Record Video",
"Cancel" ;
AlertDialog.Builder builder = new AlertDialog.Builder(Shareonwall.this);
builder.setTitle("Select profile Photo!");
builder.setItems(items, new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int item)
if (items[item].equals("Take Photo"))
if (Build.VERSION.SDK_INT >= 23)
if ((ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED))
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
else
if ((ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED))
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
else
ActivityCompat.requestPermissions(Shareonwall.this,
new String[]android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.CAMERA,
MY_PERMISSIONS_REQUEST_CAMERA);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
else
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);;
else if (items[item].equals("Choose from Library"))
if (Build.VERSION.SDK_INT >= 23)
if ((ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED))
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(
Intent.createChooser(intent, "Select File"),
SELECT_FILE);
else
if ((ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED))
else
ActivityCompat.requestPermissions(Shareonwall.this,
new String[]Manifest.permission.READ_EXTERNAL_STORAGE,
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
else
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(
Intent.createChooser(intent, "Select File"),
SELECT_FILE);
if (items[item].equals("Record Video"))
if (Build.VERSION.SDK_INT >= 23)
if ((ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED))
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null)
startActivityForResult(takeVideoIntent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
else
if ((ContextCompat.checkSelfPermission(Shareonwall.this,
android.Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED))
else
ActivityCompat.requestPermissions(Shareonwall.this,
new String[]Manifest.permission.READ_EXTERNAL_STORAGE,
MY_PERMISSIONS_REQUEST_CAMERA_VIDEO);
else
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null)
startActivityForResult(takeVideoIntent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
else if (items[item].equals("Cancel"))
dialog.dismiss();
);
builder.show();
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data)
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK)
if (requestCode == SELECT_FILE)
onSelectFromGalleryResult(data);
else if (requestCode == REQUEST_CAMERA)
onCaptureImageResult(data);
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK)
// Uri videoUri = data.getData();
// mVideoView.setVideoURI(videoUri);
// recordVideo(videoUri);
String selectedVideoFilePath = GetFilePathFromDevice.getPath(this, data.getData());
final byte[] datas;
try
datas = readBytes(selectedVideoFilePath,data.getData());
PostVideo(datas, selectedVideoFilePath);
catch (IOException e)
e.printStackTrace();
public byte[] readBytes(String dataPath,Uri uri) throws IOException
InputStream inputStream = new FileInputStream(dataPath);
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1)
byteBuffer.write(buffer, 0, len);
ShareDialogVideo(uri);
return byteBuffer.toByteArray();
public void PostVideo(byte[] VideoBytes, String filePath)
String url;
url = "/me/videos";
AccessToken token = AccessToken.getCurrentAccessToken();
if (token != null)
Bundle param = new Bundle();
param.putByteArray("video." + getFileExt(filePath), VideoBytes);
param.putString("description", "sample video");
new GraphRequest(token,url, param, HttpMethod.POST, new GraphRequest.Callback()
public void onCompleted(GraphResponse response)
Log.e("New Post", "Res =" + response.toString());
// dialog.dismiss();
if (response != null && response.getJSONObject() != null && response.getJSONObject().has("id"))
Log.e("New Post", "Success");
Toast.makeText(Shareonwall.this, "Video posted successfully.", Toast.LENGTH_SHORT).show();
else
Toast.makeText(Shareonwall.this, "Error in posting Video.", Toast.LENGTH_SHORT).show();
setResult(Activity.RESULT_OK, new Intent());
finish();
).executeAsync();
public static String getFileExt(String fileName)
return fileName.substring((fileName.lastIndexOf(".") + 1), fileName.length());
/**** this method used for select image From Gallery *****/
private void onSelectFromGalleryResult(Intent data)
Uri selectedImageUri = data.getData();
String[] projection = MediaStore.MediaColumns.DATA ;
Cursor cursor = managedQuery(selectedImageUri, projection, null, null,
null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
cursor.moveToFirst();
String selectedImagePath = cursor.getString(column_index);
Bitmap thumbnail;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(selectedImagePath, options);
final int REQUIRED_SIZE = 200;
int scale = 1;
while (options.outWidth / scale / 2 >= REQUIRED_SIZE
&& options.outHeight / scale / 2 >= REQUIRED_SIZE)
scale *= 2;
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
thumbnail = BitmapFactory.decodeFile(selectedImagePath, options);
ShareDialog(thumbnail);
/*** this method used for take profile photo *******/
private void onCaptureImageResult(Intent data)
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
File destination = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
FileOutputStream fo;
try
destination.createNewFile();
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.close();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
ShareDialog(thumbnail);
// This method is used to share Image on facebook timeline.
public void ShareDialog(Bitmap imagePath)
SharePhoto photo = new SharePhoto.Builder()
.setBitmap(imagePath)
.setCaption("Testing")
.build();
SharePhotoContent content = new SharePhotoContent.Builder()
.addPhoto(photo)
.build();
shareDialog.show(content);
public void ShareDialogVideo(Uri imagePath)
ShareVideo shareVideo = new ShareVideo.Builder()
.setLocalUrl(imagePath)
.build();
ShareVideoContent content = new ShareVideoContent.Builder()
.setVideo(shareVideo)
.build();
shareDialog.show(content);
// Initialize the facebook sdk and then callback manager will handle the login responses.
protected void facebookSDKInitialize()
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
@Override
public void onBackPressed()
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START))
drawer.closeDrawer(GravityCompat.START);
else
super.onBackPressed();
/*
Set Navigation header by using Layout Inflater.
*/
public void setNavigationHeader()
navigation_view = (NavigationView) findViewById(R.id.nav_view);
View header = LayoutInflater.from(this).inflate(R.layout.nav_header_home, null);
navigation_view.addHeaderView(header);
user_name = (TextView) header.findViewById(R.id.username);
user_picture = (ImageView) header.findViewById(R.id.profile_pic);
user_email = (TextView) header.findViewById(R.id.email);
/*
Set User Profile Information in Navigation Bar.
*/
public void setUserProfile(String jsondata)
try
response = new JSONObject(jsondata);
user_email.setText(response.get("email").toString());
user_name.setText(response.get("name").toString());
profile_pic_data = new JSONObject(response.get("picture").toString());
profile_pic_url = new JSONObject(profile_pic_data.getString("data"));
Picasso.with(this).load(profile_pic_url.getString("url"))
.into(user_picture);
catch (Exception e)
e.printStackTrace();
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.home, menu);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings)
return true;
return super.onOptionsItemSelected(item);
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item)
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera)
// Handle the camera action
else if (id == R.id.nav_gallery)
else if (id == R.id.nav_slideshow)
else if (id == R.id.nav_manage)
else if (id == R.id.nav_share)
else if (id == R.id.nav_send)
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
@Override
protected void onResume()
super.onResume();
// Logs 'install' and 'app activate' App Events.
AppEventsLogger.activateApp(this);
@Override
protected void onPause()
super.onPause();
// Logs 'app deactivate' App Event.
AppEventsLogger.deactivateApp(this);
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED)
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(
Intent.createChooser(intent, "Select File"),
SELECT_FILE);
else
return;
case MY_PERMISSIONS_REQUEST_CAMERA:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
else
return;
case MY_PERMISSIONS_REQUEST_CAMERA_VIDEO :
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null)
startActivityForResult(takeVideoIntent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
// other 'case' lines to check for other
// permissions this app might request
【讨论】:
以上是关于facebook的Android共享意图-共享文本和链接的主要内容,如果未能解决你的问题,请参考以下文章
使用 Android 分享 Intent 在 Facebook 上分享视频
使用android意图将带有图像的文本共享到instagram
如何从 android 应用程序将纯文本共享到 facebook messenger
无法使用 android 上的 cordova socialsharing 插件在 facebook 上共享自定义文本