Android共享意图为Facebook分享文本和链接

我正在尝试使用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应用程序中的一个主要的错误,短信不能发布在所有(共享意图)?

Solutions Collecting From Web of "Android共享意图为Facebook分享文本和链接"

我只是build立了这个代码,它为我工作:

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

如果您打算使用常规的Android共享内容,那么不幸的是,Facebook共享意图只能使用一个URL(请确保它具有http://),并且没有其他文本消息。 这是一个奇怪的限制,没有任何意义。

您必须在您的项目中使用官方独立的Facebook Android SDK才能获得完整的共享function。 这是额外的工作。

我碰到类似的问题。 最后,我所做的是分支的意图。 如果他们select通过Facebook共享(在常规的Android共享意图),创build一个新的共享意图,只有url和推送到Facebook。 所有其他的股票期权(微博,消息,电子邮件)将正常工作。

我的问题和解决scheme在这里:

分享Android共享意图附加费,取决于他们select分享哪种方法

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

在棒棒糖(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); } 

在我的应用程序中,我已经整合了Facebook SDK,使用户能够在墙上分享报价[预填充文本]。 使用FB SDK,可以做到这一点。 它在我的应用程序中工作,我有超过5K用户使用相同的。

显然这并不违反FB的政策,因为我没有提出任何警告或问题。

代码片段相同可以在这里find,

有没有广泛使用的Android应用程序有Facebook的预填充文本字段分享?

使用此代码共享Facebook上的图像,video,链接和文本完美的工作

  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://sofzh.miximages.com/android/dashboard.jpg")) .setContentDescription( "simple Fb Image share integration") .setContentUrl(Uri.parse("http://sofzh.miximages.com/android/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 } } }