I have been trying to post on google plus stream since morning, but it does not getting posted all contents specified in deeplinkid only the content inside setText() gets posted. here is my code,

  Intent shareIntent = new PlusShare.Builder(this)
                    .setText("Hello Android!")
                    .setType("image/png")
                    .setContentDeepLinkId(offrdetails_data.get(0).offerLink,
                            offrdetails_data.get(0).dealTitle, 
                            offrdetails_data.get(0).dealDescription, 
                            Uri.parse(offrdetails_data.get(0).dealImage))
                    .getIntent();
startActivityForResult(shareIntent, 0);

Solution 1:

I found the solution for sharing on google plus from android:-

Steps :- 1. Generate SH1 Key by the following commands:-

$keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v

2:- Create project on google api console and also create client id. https://developers.google.com/+/mobile/android/getting-started

3.Add the google play service library to project from extras.If not exist then download the google play service using sdk manager.

4.Add values in string.xml from /extras/google/google_play_services/samples/plus/res/values/string.xml

5.Add the the permisson in androidMenifest.xml

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.GET_ACCOUNTS" />
      <uses-permission android:name="android.permission.VIBRATE" />
      <uses-permission android:name="android.permission.WAKE_LOCK" />

6.Add the below class in your project

    public class GooglePlusShareActivity extends Activity implements  
            View.OnClickListener,
            PlusClient.ConnectionCallbacks,
            PlusClient.OnConnectionFailedListener,
            DialogInterface.OnCancelListener {
        protected static final String TAG = "ShareActivity";

        private static final String STATE_SHARING = "state_sharing";

        private static final int DIALOG_GET_GOOGLE_PLAY_SERVICES = 1;

        private static final int REQUEST_CODE_SIGN_IN = 1;
        private static final int REQUEST_CODE_INTERACTIVE_POST = 2;
        private static final int REQUEST_CODE_GET_GOOGLE_PLAY_SERVICES = 3;

        /** The button should say "View item" in English. */
        private static final String LABEL_VIEW_ITEM = "VIEW_ITEM";

        private EditText mEditSendText;
        private boolean mSharing;
        private PlusClient mPlusClient; 

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

        mPlusClient = new PlusClient.Builder(this, this, this)
                .setActions(MomentUtil.ACTIONS)
                .build();

        Button sendButton = (Button) findViewById(R.id.send_interactive_button);
        sendButton.setOnClickListener(this);

        mEditSendText = (EditText) findViewById(R.id.share_prefill_edit);
        mSharing = savedInstanceState != null
                && savedInstanceState.getBoolean(STATE_SHARING, false);

        int available =
          GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
          if (available != ConnectionResult.SUCCESS) {
            showDialog(DIALOG_GET_GOOGLE_PLAY_SERVICES);
        }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        if (id != DIALOG_GET_GOOGLE_PLAY_SERVICES) {
            return super.onCreateDialog(id);
        }

        int available =  
        GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (available == ConnectionResult.SUCCESS) {
            return null;
        }
        if (GooglePlayServicesUtil.isUserRecoverableError(available)) {
            return GooglePlayServicesUtil.getErrorDialog(
                    available, this, REQUEST_CODE_GET_GOOGLE_PLAY_SERVICES, 
        this);
        }
        return new AlertDialog.Builder(this)
                .setMessage(R.string.plus_generic_error)
                .setCancelable(true)
                .setOnCancelListener(this)
                .create();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(STATE_SHARING, mSharing);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.send_interactive_button:
                if (!mPlusClient.isConnected()) {
                    // Set sharing so that the share is started in onConnected.
                    mSharing = true;

                    if (!mPlusClient.isConnecting()) {
                        mPlusClient.connect();
                    }
                } else {
                    startActivityForResult(
                            getInteractivePostIntent(), 
                  REQUEST_CODE_INTERACTIVE_POST);
                }
        }
     }




    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent
    intent) {
        switch (requestCode) {
            case REQUEST_CODE_SIGN_IN:
            case REQUEST_CODE_GET_GOOGLE_PLAY_SERVICES:
                handleResult(resultCode);
                break;

            case REQUEST_CODE_INTERACTIVE_POST:
                mSharing = false;
                if (resultCode != RESULT_OK) {
                    Log.e(TAG, "Failed to create interactive post");
                }
                break;
        }
    }

    private void handleResult(int resultCode) {
        if (resultCode == RESULT_OK) {
            // onActivityResult is called after onStart (but onStart is not
            // guaranteed to be called while signing in), so we should make
            // sure we're not already connecting before we call connect again.
            if (!mPlusClient.isConnecting() && !mPlusClient.isConnected()) {
                mPlusClient.connect();
            }
        } else {
            Log.e(TAG, "Unable to sign the user in.");
            finish();
        }
    }

    private Intent getInteractivePostIntent() {
        // Create an interactive post with the "VIEW_ITEM" label. This will
        // create an enhanced share dialog when the post is shared on Google+.
        // When the user clicks on the deep link, ParseDeepLinkActivity will
        // immediately parse the deep link, and route to the appropriate 
        resource.
        String action = "/?view=true";
        Uri callToActionUrl = 
        Uri.parse(getString(R.string.plus_example_deep_link_url) + action);
        String callToActionDeepLinkId =
        getString(R.string.plus_example_deep_link_id) + action;

        // Create an interactive post builder.
        PlusShare.Builder builder = new PlusShare.Builder(this, mPlusClient);

        // Set call-to-action metadata.
        builder.addCallToAction(LABEL_VIEW_ITEM, callToActionUrl, 
        callToActionDeepLinkId);

        // Set the target url (for desktop use).
         builder.setContentUrl(Uri.parse
                    (getString(R.string.plus_example_deep_link_url)));

        // Set the target deep-link ID (for mobile use).
        builder.setContentDeepLinkId(
        getString(R.string.plus_example_deep_link_id),
                null, null, null);

        // Set the pre-filled message.
        builder.setText(mEditSendText.getText().toString());

        return builder.getIntent();
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        if (!mSharing) {
            // The share button hasn't been clicked yet.
            return;
        }

        mSharing = false;
        startActivityForResult(getInteractivePostIntent(),
     REQUEST_CODE_INTERACTIVE_POST);
    }

    @Override
    public void onDisconnected() {
        // Do nothing.
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (!mSharing) {
            return;
        }

        try {
            result.startResolutionForResult(this, REQUEST_CODE_SIGN_IN);
        } catch (IntentSender.SendIntentException e) {
            // Try to connect again and get another intent to start.
            mPlusClient.connect();
        }
    }

    @Override
    public void onCancel(DialogInterface dialogInterface) {
        Log.e(TAG, "Unable to sign the user in.");
        finish();
    }
}

7.Add Another class as below

   public class MomentUtil {

    /**
     * A mapping of moment type to target URL.
     */
    public static final HashMap<String, String> MOMENT_TYPES;

    /**
     * A list of moment target types.
     */
    public static final ArrayList<String> MOMENT_LIST;
    public static final String[] ACTIONS;
    static {
        MOMENT_TYPES = new HashMap<String, String>(9);
        MOMENT_TYPES.put("AddActivity",
                "https://developers.google.com/+/plugins/snippet/examples
        /thing");
        MOMENT_TYPES.put("BuyActivity",
                "https://developers.google.com/+/plugins/snippet/examples
        /a-book");
        MOMENT_TYPES.put("CheckInActivity",
                "https://developers.google.com/+/plugins/snippet/examples
        /place");
        MOMENT_TYPES.put("CommentActivity",
                "https://developers.google.com/+/plugins/snippet/examples/blog-
        entry");
        MOMENT_TYPES.put("CreateActivity",
                "https://developers.google.com/+/plugins/snippet/examples
       /photo");
        MOMENT_TYPES.put("ListenActivity",
                "https://developers.google.com/+/plugins/snippet/examples/song");
        MOMENT_TYPES.put("ReserveActivity",
                "https://developers.google.com/+/plugins/snippet/examples

        /restaurant");
        MOMENT_TYPES.put("ReviewActivity",
                "https://developers.google.com/+/plugins/snippet/examples
        /widget");

        MOMENT_LIST = new ArrayList<String>(MomentUtil.MOMENT_TYPES.keySet());
        Collections.sort(MOMENT_LIST);

        ACTIONS = MOMENT_TYPES.keySet().toArray(new String[0]);
        int count = ACTIONS.length;
        for (int i = 0; i < count; i++) {
            ACTIONS[i] = "http://schemas.google.com/" + ACTIONS[i];
        }
    }

    /**
     * Generates the "result" JSON object for select moments.
     *
     * @param momentType The type of the moment.
     */
    public static ItemScope getResultFor(String momentType) {
        if (momentType.equals("CommentActivity")) {
            return getCommentActivityResult();
        }
        if (momentType.equals("ReserveActivity")) {
            return getReserveActivityResult();
        }
        if (momentType.equals("ReviewActivity")) {
            return getReviewActivityResult();
        }
        return null;
    }

    /**
     * Generates the "result" JSON object for CommentActivity moment.
     */
    private static ItemScope getCommentActivityResult() {
        return new ItemScope.Builder()
            .setType("http://schema.org/Comment")
            .setUrl("https://developers.google.com/+/plugins/snippet/examples
        /blog-entry#comment-1")
            .setName("This is amazing!")
            .setText("I can't wait to use it on my site!")
            .build();
    }

    /**
     * Generates the "result" JSON object for ReserveActivity moment.
     */
    private static ItemScope getReserveActivityResult() {
        return new ItemScope.Builder()
            .setType("http://schemas.google.com/Reservation")
            .setStartDate("2012-06-28T19:00:00-08:00")
            .setAttendeeCount(3)
            .build();
    }

    /**
     * Generates the "result" JSON object for ReviewActivity moment.
     */
    private static ItemScope getReviewActivityResult() {
        ItemScope rating = new ItemScope.Builder()
            .setType("http://schema.org/Rating")
            .setRatingValue("100")
            .setBestRating("100")
            .setWorstRating("0")
            .build();

        return new ItemScope.Builder()
            .setType("http://schema.org/Review")
            .setName("A Humble Review of Widget")
            .setUrl("https://developers.google.com/+/plugins/snippet/examples
          /review")
            .setText("It is amazingly effective")
            .setReviewRating(rating)
            .build();
    }
}

8.Add share_activity.xml file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dip">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/share_title"
        android:paddingBottom="5dip"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    <EditText
        android:id="@+id/share_prefill_edit"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:inputType=""
        android:text="@string/share_prefill_text"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_marginBottom="30dip" />
    <Button
        android:id="@+id/send_interactive_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/send_interactive_button_name"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

9.Import all the packages ctrl+shift+O

Thanks!!I hope it will work.

Solution 2:

I just tested your code with a minimal MainActivity and it worked:

public class MainActivity extends Activity implements View.OnClickListener {

private Button mButton;

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

    mButton = (Button) findViewById(R.id.button1);
    mButton.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {
    Intent shareIntent = new PlusShare.Builder(this)
            .setText("Hello Android!")
            .setType("image/png")
            .setContentDeepLinkId("testID",
                    "Test Title",
                    "Test Description",
                    Uri.parse("https://developers.google.com/+/images/interactive-post-android.png"))
            .getIntent();
    startActivityForResult(shareIntent, 0);
}

}

Are you sure that offrdetails_data.get(0) actually contains data?

Edit in response to comments: It may be that offrdetails_data.get(0).offerLink is longer than 512 characters.

The limit on deep link IDs is 512 characters (see description for data-calltoactiondeeplinkid):

https://developers.google.com/+/web/share/interactive#interactive_share_button_attributes