Cropper
Cropper

Reputation: 1177

"code" : 403, and "reason" : "forbidden" exception at uploading file in google plus

I trying to upload media file on google+ and i have created Client id at google console. I have get uploading method form
attaching-media

authentication

when running the application I am getting exception at line

 Media result = null;
                    try {
                        result = insertRequest.execute();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        // e1.printStackTrace();
                        Log.e("result exception", "" + e1);
                    }

exception are :

 12-09 18:49:20.983: E/result exception(26301):com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
12-09 18:49:20.983: E/result exception(26301): {
12-09 18:49:20.983: E/result exception(26301):   "code" : 403,
12-09 18:49:20.983: E/result exception(26301):   "errors" : [ {
12-09 18:49:20.983: E/result exception(26301):     "domain" : "global",
12-09 18:49:20.983: E/result exception(26301):     "message" : "Forbidden",
12-09 18:49:20.983: E/result exception(26301):     "reason" : "forbidden"
12-09 18:49:20.983: E/result exception(26301):   } ],
12-09 18:49:20.983: E/result exception(26301):   "message" : "Forbidden"
12-09 18:49:20.983: E/result exception(26301): }

and my code is blow:

  public class MainActivity extends Activity {
public static final String CLIENT_ID = "***********************************";
public static final String CLIENT_SECRET = "******************************";
String REDIRECT_URI = "http://localhost";
//  String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
JsonFactory jsonFactory = new JacksonFactory();
String posturl ="https://www.googleapis.com/upload/plusDomains/v1/people/userId/media/collection";
HttpTransport transport = new NetHttpTransport();
GoogleTokenResponse tokenResponse;
@SuppressLint({ "NewApi", "SetJavaScriptEnabled" })
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.activity_main);
    WebView webview = new WebView(this);
    webview.setVisibility(View.VISIBLE);
    webview.getSettings().setJavaScriptEnabled(true);
    setContentView(webview);

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();

    StrictMode.setThreadPolicy(policy);
    Collection<String> SCOPE = Arrays.asList(
            "https://www.googleapis.com/auth/plus.me",
            "https://www.googleapis.com/auth/plus.media.upload",
            "https://www.googleapis.com/auth/plus.stream.write");
    //      "https://www.googleapis.com/auth/plus.profiles.read");
    final GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            transport, jsonFactory, CLIENT_ID,
            CLIENT_SECRET, SCOPE).setApprovalPrompt("force")
            .setAccessType("offline").build();

    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI)
            .build();
    System.out.println("url:  " + url);
    webview.loadUrl(url);

    webview.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {

            if (url.startsWith(REDIRECT_URI)) {

                if (url.indexOf("code=") != -1) {
            // Url is like  http://localhost/?code=4/Z5DgC1IxNL-muPsrE2Sjy9zQn2pF
                    String code = url.substring(REDIRECT_URI.length() + 7,
                            url.length());

                    System.out.println("code:  " + code);
                    tokenResponse = null;
                    try {
                        tokenResponse = flow.newTokenRequest(code)
                                .setRedirectUri(REDIRECT_URI).execute();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    GoogleCredential credential =  new GoogleCredential.Builder()
                            .setTransport(transport)
                            .setJsonFactory(jsonFactory)
                            .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
                            .addRefreshListener(
                                    new CredentialRefreshListener() {
                                        @Override
                                        public void onTokenResponse(
                                                Credential credential,
                                                TokenResponse tokenResponse) {
                                            System.out
                                                    .println("Credential was refreshed successfully.");
                                        }

                                        @Override
                                        public void onTokenErrorResponse(
                                                Credential credential,
                                                TokenErrorResponse tokenErrorResponse) {
                                            System.err
                                                    .println("Credential was not refreshed successfully. "
                                                            + "Redirect to error page or login screen.");
                                        }
                                    }).build();

                    credential.setFromTokenResponse(tokenResponse);

                    PlusDomains plusDomains = new PlusDomains.Builder(
                            transport, jsonFactory, credential).setApplicationName("RiskScore").build();

                    String userId = "me"; // Requires the plus.me scope
                    File jpegFile = null;
                      jpegFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/RiskScore/20131205115454.jpg");



                    Media mediaDescription = new Media();
                    mediaDescription.setDisplayName("A picture of Score");
                    Insert insertRequest = null;
                    try {
                        insertRequest = plusDomains.media().insert(userId,
                                "cloud", mediaDescription,
                                new FileContent("image/jpeg", jpegFile));
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        // e1.printStackTrace();
                        Log.e("insertRequest exception", "" + e1);
                    }

                    Media result = null;
                    try {
                        result = insertRequest.execute();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        // e1.printStackTrace();
                        Log.e("result exception", "" + e1);
                    }
                    if (result != null) {
                        String mediaId = result.getId();

                        // Now create a post using the uploaded image

                        // Create the activity and populate the contents
                        com.google.api.services.plusDomains.model.Activity activity = new com.google.api.services.plusDomains.model.Activity();
                        activity.setObject(new PlusDomainsObject());
                        activity.getObject().setContent("Risk Project....");

                        // Attach the photo
                        PlusDomainsObject.Attachments attachment = new PlusDomainsObject.Attachments();
                        attachment.setObjectType("photo"); 
                        attachment.setId(mediaId);
                        ArrayList<Attachments> attachments = new ArrayList<PlusDomainsObject.Attachments>();
                        attachments.add(attachment); 
                        // You can also add multiple attachments to the post
                        activity.getObject().setAttachments(attachments);

                        // Set the activity to be visible only to your domain
                        PlusDomainsAclentryResource acl = new PlusDomainsAclentryResource();
                        acl.setType("domain");
                        Acl aclEntries = new Acl();
                        aclEntries
                                .setItems(new ArrayList<PlusDomainsAclentryResource>());
                        aclEntries.getItems().add(acl);
                        aclEntries.setDomainRestricted(true); 
                        // Required, this does the domain restriction
                        activity.setAccess(aclEntries);

                        // Post the activity
                        com.google.api.services.plusDomains.model.Activity newActivity = null;
                        try {
                            newActivity = plusDomains.activities()
                                    .insert(userId, activity).execute();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        System.out.println("New activity created with ID "
                                + newActivity.getId());
                        System.out.println("URL: " + newActivity.getUrl());

                        view.setVisibility(View.INVISIBLE);
                    }
                } else if (url.indexOf("error=") != -1) {
                    view.setVisibility(View.INVISIBLE);
                }
            }
        }
    });

}

}

Upvotes: 10

Views: 10621

Answers (2)

Cropper
Cropper

Reputation: 1177

I think This code is for server side uploading and And I'm trying to upload file through Android phone so that it's showing Exception. By these Question1 and Question2 I found that Google+ does not have an independent write API available to general developers - the only way to post to Google+ via an app.

Note: But if any one know about Google+ write API for general developers then Please help me.

Upvotes: 5

Joanna
Joanna

Reputation: 2176

To use the Google+ Domains API, you need to make sure that the Domain for the user you are acting on behalf of has been set up with the right permissions for your app. These instructions are under the "Delegate domain-wide authority to your service account" section of Step 1 of the quick-start guide.

Specifically, you need to associate your app's Client ID with the scopes your app will use in the control panel for the domain. The domain administrator is the only person who can do this--so if you are working with another domain, be sure you get in contact with that person. Also, the scopes listed in the control panel must match EXACTLY with the scopes you request in your app.

Upvotes: 5

Related Questions