首页 文章

Android共享文本和链接的Android共享意图

提问于
浏览
31

我正在尝试使用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应用程序中的一个主要错误,根本无法发布文本消息(具有共享意图)?

5 回答

  • 6

    我刚刚构建了这段代码,它对我有用:

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

    如果您打算使用常规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;
        }
    }
    
  • 11

    在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);
    }
    
  • 0

    在我的应用程序中,我集成了Facebook SDK,以便用户在他们的墙上分享报价[预填充文本] . 使用FB SDK,可以执行此操作 . 它适用于我的应用程序,我有超过5K用户使用相同的 .

    显然这不违反FB的政策,因为我没有任何警告或问题,这不起作用 .

    可以在这里找到相同的代码片段,

    Do any widely used Android apps have Facebook sharing with pre-populated text field?

  • 1

    USe this code for share image ,video,link and text on facebook working perfectally

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

相关问题