微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google Cloud StorageException:匿名调用者没有对 Google Cloud Storage 对象的 storage.objects.create 访问权限

如何解决Google Cloud StorageException:匿名调用者没有对 Google Cloud Storage 对象的 storage.objects.create 访问权限

我正在尝试将图像上传到 Google Cloud Storage 客户端,但出现此异常,我已尝试对此进行搜索,但在 android 中没有关于此问题的问题并且无法继续,这是我的代码

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    private String currentPhotoPath;
    private String imageName;
    public static final int REQUEST_IMAGE_CAPTURE = 1;
    private File photoFile = null;
    private String[] permissions;
    public static final int PERMISSION_REQ_CODE = 200;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView= findViewById(R.id.textView);
        permissions = new String[]{Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.ACCESS_COARSE_LOCATION};
        acceptPermissions();

        textView.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dispatchTakePictureIntent();
            }
        });
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        try {
            photoFile = createImageFile();
        } catch (Exception ex) {
            ex.printstacktrace();
        }
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,getPackageName(),photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);
            startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE);
        }
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        String fileName = "temp";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(fileName,".jpg");
        currentPhotoPath = image.getAbsolutePath();
        imageName = image.getName();
        return image;
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try  {
                        Uploadobject.uploadobject("project_id","bucktedname",imageName,currentPhotoPath);                       
                    } catch (Exception e) {
                        e.printstacktrace();
                    }
                }
            });
            thread.start();          
        }
    }

    private void acceptPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(getApplicationContext(),permissions[0]) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getApplicationContext(),permissions[1]) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getApplicationContext(),permissions[2]) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getApplicationContext(),permissions[3]) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getApplicationContext(),permissions[4]) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getApplicationContext(),permissions[5]) != PackageManager.PERMISSION_GRANTED)
                requestPermissions(permissions,PERMISSION_REQ_CODE);
            else {
                if ((ContextCompat.checkSelfPermission(getApplicationContext(),permissions[0]) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(getApplicationContext(),permissions[1]) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(getApplicationContext(),permissions[2]) != PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(getApplicationContext(),permissions[3]) != PackageManager.PERMISSION_GRANTED) || ContextCompat.checkSelfPermission(getApplicationContext(),permissions[5]) != PackageManager.PERMISSION_GRANTED)
                    requestPermissions(permissions,PERMISSION_REQ_CODE);
            }
        }
    }

}

上传对象.Java

public class Uploadobject {
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static void uploadobject(
            String projectId,String bucketName,String objectName,String filePath) throws IOException {

        Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
        BlobId blobId = BlobId.of(bucketName,objectName);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
        storage.create(blobInfo,Files.readAllBytes(Paths.get(filePath)));
        System.out.println(
                "File " + filePath + " uploaded to bucket " + bucketName + " as " + objectName);
    }
}

Logcat:

W/System.err: com.google.cloud.storage.StorageException: Anonymous caller does not have storage.objects.create access to the Google Cloud Storage object.
        at com.google.cloud.storage.spi.v1.HttpStorageRpc.translate(HttpStorageRpc.java:232)
        at com.google.cloud.storage.spi.v1.HttpStorageRpc.create(HttpStorageRpc.java:313)
        at com.google.cloud.storage.StorageImpl$3.call(StorageImpl.java:221)
W/System.err:     at com.google.cloud.storage.StorageImpl$3.call(StorageImpl.java:218)
        at com.google.api.gax.retrying.DirectretryingExecutor.submit(DirectretryingExecutor.java:105)
        at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
        at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
        at com.google.cloud.storage.StorageImpl.internalCreate(StorageImpl.java:217)
        at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:171)
W/System.err:     at com.example.googlecloudstorgae.Uploadobject.uploadobject(Uploadobject.java:35)
        at com.example.googlecloudstorgae.MainActivity$2.run(MainActivity.java:111)
        at java.lang.Thread.run(Thread.java:923)
W/System.err: Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
    POST https://storage.googleapis.com/upload/storage/v1/b/"bucket-Name"/o?projection=full&uploadType=multipart
W/System.err: {
      "code" : 401,"errors" : [ {
        "domain" : "global","location" : "Authorization","locationType" : "header","message" : "Anonymous caller does not have storage.objects.create access to the Google Cloud Storage object.","reason" : "required"
      } ],W/System.err:   "message" : "Anonymous caller does not have storage.objects.create access to the Google Cloud Storage object."
    }
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:118)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:37)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:532)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:455)
W/System.err:     at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:565)
        at com.google.cloud.storage.spi.v1.HttpStorageRpc.create(HttpStorageRpc.java:310)
        ... 10 more

我遵循了 Google 官方文档 this 中的文档。任何帮助表示赞赏。

解决方法

这似乎是一个授权问题。

"code" : 401,"message" : "Anonymous caller does not have storage.objects.create access to the Google Cloud Storage object.

您可能需要检查您尝试访问存储桶的用户的访问权限。 如果您具有仪表板访问权限,则可以检查权限。或者尝试使用与 gsutil 相同的 json 证书执行相同的操作

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。