“code”:403,“reason”:在 google plus 中上传文件时出现“禁止”异常

2023-11-21

我尝试在 google+ 上上传媒体文件,并且我已在 google 控制台创建了客户端 ID。 我已经获得上传方法表格
附加媒体

验证

运行应用程序时,我在行中遇到异常

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

}

}


要使用 Google+ Domains API,您需要确保您所代表的用户的域已为您的应用设置了正确的权限。这些说明位于第 1 步的“将域范围内的权限委托给您的服务帐户”部分。快速入门指南.

具体来说,您需要将应用程序的客户端 ID 与应用程序将在域的控制面板中使用的范围相关联。域管理员是唯一可以执行此操作的人 - 因此,如果您正在使用另一个域,请确保与该人联系。此外,控制面板中列出的范围必须与您在应用程序中请求的范围完全匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“code”:403,“reason”:在 google plus 中上传文件时出现“禁止”异常 的相关文章

  • 在 Android 8 (Oreo) 的 Webview 中获取 Resources$NotFoundException

    我正在我的应用程序的 WebView 中加载网站的 URL 该网站获取用户的基本详细信息 我正在活动中加载 WebView 但是 当 Android 8 用户点击网站的下拉菜单时 应用程序会抛出以下错误 请注意 此 WebView 在 An
  • Android Studio 0.8.2 URI 有一个权限组件

    我收到 Gradle 项目同步失败 消息 当我启动 Android Studio 时 当我尝试清理项目时 我收到 无法完成 Gradle 执行原因 URI 具有权限组件 我已经尝试了几件事 但仍然陷入困境 我将配置文件从用户文件夹中移出 并
  • 尽管使用了 NTP 偏移量,设备仍会在几秒后启动指令

    背景 我有两台物理设备 一台 Galaxy S3 手机 和一台 Asus 700T 平板电脑 我想在同一时间执行同一组指令 因此 我使用的是 Android 的平台框架 基本 SNTP 客户端代码 https github com andr
  • 如何刷新 Android 上的 MediaStore?

    这最初是 Android 论坛上的一个一般用户问题 然而 它必然成为一个编程问题 这是我的问题 Android 有一个服务 MediaScanner 每当 我相信 SD 卡卸载和重新安装时它都会在后台运行 该服务收集卡上所有媒体文件的数据
  • 如何平移画布并仍然在正确的位置获取触摸事件

    我正在尝试创建一个自定义 AbsListView 覆盖 ListView GridView 和 HeaderGridView 上的相同内容 它将根据外部因素 在布局上移动的其他内容 重新定位其所有绘图和触摸事件 填充在这里不是一个选项 因为
  • 创建像 facebook android 一样的登录动画

    我想创建一个登录页面 如 facebook android 应用程序 其中包含用户名和密码EditText字段被隐藏 页面上会显示一个徽标 该徽标会在上方动画一定距离并停留在新位置 然后显示编辑字段 这是我尝试过的 但这里的徽标从页面底部开
  • 将 match_parent 转换为“0dp”

    当我使用android layout height match parent or android layout width match parent 作为约束布局中子项的高度 宽度并构建 Gradle 文件 它会自动更改为android
  • Android 4.4 (kitkat) 版本中的短信阻止和允许问题

    我们在 Google Play 上推出了短信拦截应用程序 如果满足任何阻止条件 它就会阻止短信 否则我们允许短信发送到本机收件箱 它在除 android 4 4 Kitkat 之外的所有版本上都运行良好 我们尝试实现适用于 4 4 的新短信
  • 从图库加载图像时应用程序崩溃

    在我的应用程序中 我有两个按钮 一个用于从图库 从设备 加载图像 另一个用于通过访问设备的相机拍照 我的代码在某些设备上正常工作 bt在某些设备上 应用程序单击图库中的图像时崩溃 任何人都可以帮助我找出实际问题吗 public class
  • 自定义 listView 按随机顺序显示较少的项目

    我为我的 Android 应用程序制作了一个自定义的膨胀 listView 但 getView 方法有问题 public class BinderData extends BaseAdapter private LayoutInflater
  • 如何从 Android 服务获取应用程序上下文?

    我有一个正在运行并监听麦克风输入的 Android 服务 我希望它在满足特定条件时启动一项活动 为了创建意图 我需要应用程序上下文 我怎么才能得到它 Intent i new Intent ctx SONR class i addFlags
  • GPSTracker 类不工作

    我尝试在我的应用程序中使用我在网上找到的 GPSTracker 类 并且我之前让它工作过 但现在似乎莫名其妙地不起作用 public class GPSTracker extends Service implements LocationL
  • 片段和通知:针对通知中的不同活动;取决于屏幕配置

    问题 如何决定做什么Activity a Notification如果目标可能取决于配置 屏幕尺寸 方向等 则应启动 就像人们使用时经常出现的情况一样Fragments Details 让我们考虑一下新闻阅读器示例 http develop
  • 删除 android ListView 的底部分隔线

    我有固定的高度ListView 它在列表项之间有分隔线 但它还在最后一个列表项之后显示分隔线 有没有办法在最后一项之后不显示分隔线ListView 只需添加android footerDividersEnabled false 到您的 Li
  • org.apache.http 软件包在 API 级别 23 中被删除。替代方案是什么?

    在更新到最新的 android API 级别 23 Marshmallow 后 通过 build gradle 添加以下更改后 所有 org apache http 类都不起作用 android compileSdkVersion 23 b
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • ACTION_MEDIA_BUTTON 的广播接收器不起作用

    我正在为 Android 操作系统版本 4 0 3 ICS 编写 Android 应用程序 问题是我没有从 BroadcastReceiver 的 onReceive 方法中的 Log d 获得输出 这意味着我的应用程序没有正确处理广播 我
  • 如何使用 Android 手机通话时播放声音?

    是否可以通过编程方式与电话进行交互 例如 您可以通过程序向呼叫者播放音频吗 Google 尚未公开任何允许我们向特定正在进行的调用提供数据的 API 不过 您可以控制通话 检查这篇文章 here http prasanta paul blo
  • 如何使用 androidX 不破坏片段

    现在 我尝试 androidX 导航和底部导航栏 当我像下面一样使用它时 supportFragmentManager getSupportFragmentManager navHostFragment NavHostFragment su

随机推荐