код: 403 и причина: запрещенное исключение при загрузке файла в google plus

Я пытаюсь загрузить медиафайл в Google+ и создал идентификатор клиента в консоли Google. У меня есть форма метода загрузки
attaching-media

аутентификация

при запуске приложения я получаю исключение в строке

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

исключение составляют:

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

и мой код удар:

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

}

}


person Cropper    schedule 09.12.2013    source источник
comment
я не знаком с этим ... это до-диез?   -  person    schedule 19.12.2013


Ответы (2)


Чтобы использовать Google+ Domains API, вам необходимо убедиться, что для домена пользователя, от имени которого вы действуете, установлены правильные разрешения для вашего приложения. Эти инструкции находятся в разделе «Делегирование полномочий на уровне домена вашему сервисному аккаунту» шага 1 краткого руководства. .

В частности, вам необходимо связать идентификатор клиента вашего приложения с областями, которые ваше приложение будет использовать в панели управления для домена. Администратор домена — единственный человек, который может это сделать, поэтому, если вы работаете с другим доменом, обязательно свяжитесь с этим человеком. Кроме того, области, перечисленные в панели управления, должны ТОЧНО совпадать с областями, которые вы запрашиваете в своем приложении.

person Joanna    schedule 09.12.2013
comment
Теперь мы можем поделиться медиафайлом из моего приложения с Google Plus, если на моем телефоне есть приложение Google Plus. Я хочу знать, что есть API для обмена медиафайлами в Google+ для Android, например, для обмена Picasa. - person Cropper; 10.12.2013
comment
Разве это не предназначено для авторизации (серверных) сервисных аккаунтов, а не для мобильных клиентов? В панели управления указано, что вы можете разрешить этим зарегистрированным клиентам доступ к вашим пользовательским данным без необходимости индивидуального согласия ваших пользователей или их паролей. - person Daniel Lubarov; 12.09.2016

Я думаю, что этот код предназначен для загрузки на стороне сервера, и я пытаюсь загрузить файл через телефон Android, чтобы он отображал исключение. Этими Question1 и Вопрос 2 Я обнаружил, что Google+ не имеет независимого API записи, доступного для обычных разработчиков — это единственный способ публиковать сообщения в Google+ через приложение.

Note: Но если кто-нибудь знает о Google+, напишите API для обычных разработчиков, пожалуйста, помогите мне.

person Cropper    schedule 19.12.2013