"Código": 403, y "razón": excepción "prohibida" al cargar el archivo en google plus
Estoy intentando cargar el archivo de medios en google + y he creado la identificación del cliente en la consola de google. Tengo que subir el formulario del método
Adjuntar medios
autenticación
- No se devuelve ningún dato durante la utilización de Google+
- Nativo de Google Plus Login para Xamarin.Android y Xamarin.iOS
- Abrir página en Facebook, Twitter y Google Plus desde otra aplicación - Android
- Validación del lado del servidor de token de Google Access para la aplicación de Android
- No se puede resolver la clase com.google.android.gms.plus.Plus
Al ejecutar la aplicación estoy recibiendo excepción en la línea
Media result = null; try { result = insertRequest.execute(); } catch (IOException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); Log.e("result exception", "" + e1); }
Excepción son:
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): }
Y mi código es golpe:
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); } } } }); }
}
- G + animación de la interfaz de usuario de Android
- La fuerza de la aplicación se cierra cuando google + no está instalado
- Obtención de un token de cuenta de Google de GoogleApiClient sin el permiso de GET_ACCOUNTS
- Google + para android (obtener puntero nulo)
- Error en com.google.android.gms.common.SignInButton
- Salir de la cuenta de Google Plus no funciona en android, mostrar excepción de puntero nulo
- Validación de token del backend para el inicio de sesión de Google+ en la aplicación de Android
- Android Google + integración a veces devuelve valores nulos
Para utilizar la API de dominios de Google+, debe asegurarse de que el dominio para el usuario que está actuando en nombre de se ha configurado con los permisos adecuados para su aplicación. Estas instrucciones se encuentran en la sección "Delegar autoridad de todo el dominio a su cuenta de servicio" del Paso 1 de la guía de inicio rápido .
Específicamente, debe asociar el ID de cliente de su aplicación con los ámbitos que su aplicación utilizará en el panel de control del dominio. El administrador del dominio es la única persona que puede hacer esto, por lo que si está trabajando con otro dominio, asegúrese de ponerse en contacto con esa persona. Además, los ámbitos listados en el panel de control deben coincidir EXACTAMENTE con los ámbitos solicitados en la aplicación.
Creo que este código es para el lado del servidor de carga y Y estoy tratando de subir archivos a través de teléfono Android para que se muestra la excepción. Con estas preguntas 1 y 2, encontré que Google+ no tiene una API de escritura independiente disponible para los desarrolladores generales, la única forma de publicar en Google+ a través de una aplicación.
Note
: Pero si alguien sabe acerca de Google + escribir API para los desarrolladores en general, por favor, ayúdame.
- Detenga OnLongClickListener disparando mientras arrastra
- Aplicar estilo diferente al botón cuando se presiona