У пользователя нет разрешения на доступ к этому объекту. Firebase storage android

Я новичок в хранилище firebase. Просто, чтобы я мог это изучить, я создал простую программу, в которой есть кнопка и ImageView. Когда я нажимаю на кнопку, изображение (from drawable) отображается в ImageView. Я также написал код для загрузки изображения в Firebase, но сообщение об исключении из onAddFailureListener дает сообщение У пользователя нет разрешения на доступ к этому объекту. Что мне делать?

package com.example.asad.save_photo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageMetadata;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.ByteArrayOutputStream;
import java.io.File;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FirebaseStorage storage = FirebaseStorage.getInstance();

        StorageReference storageRef = storage.getReferenceFromUrl("gs://savephoto-a1cc3.appspot.com");

        final StorageReference mountainsRef = storageRef.child("asad");

        Button butt = (Button) findViewById(R.id.button);


        butt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView imageView = (ImageView) findViewById(R.id.image);
                imageView.setImageResource(R.drawable.back2);
                //imageView.setImageResource(R.drawable.back2);

                imageView.setDrawingCacheEnabled(true);
                imageView.buildDrawingCache();
                Bitmap bitmap = imageView.getDrawingCache();


                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                final byte[] data = baos.toByteArray();

                UploadTask uploadTask = mountainsRef.putBytes(data);
                uploadTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        // Handle unsuccessful uploads
                        showToast(exception.getMessage());
                    }
                });
                        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                        //Uri downloadUrl = taskSnapshot.getDownloadUrl();
                        showToast("success !!!!!");
                    }
                });


            }
        });

    }

    public void showToast(String s) {
        Toast.makeText(this,s,Toast.LENGTH_LONG).show();
    }
}

Вот мои правила хранения firebase

service firebase.storage {
  match /b/savephoto-a1cc3.appspot.com/o {
    allow read,write;
  }
}

Ответ 1

Обновите свои правила безопасности с помощью match /{allPaths=**}, чтобы указать, что общедоступный доступ на чтение и запись разрешен на всех путях:

service firebase.storage {
  match /b/savephoto-a1cc3.appspot.com/o {
    match /{allPaths=**} {
      // Allow access by all users
      allow read, write;
    }
  }
}

В закладках раздела Примеры правил содержатся различные правила по умолчанию.

Ответ 2

Измените правила хранения в консоли Firebase

enter image description here

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Ответ 3

Просто зайдите в Storage - Rules. Введите правило следующим образом, заменив имя ведра на свое собственное имя ковша. Вы можете найти имя ведра, перейдя в Storage-Files.

Он должен выглядеть примерно так: myapplication-xxxx.appspot.com

Это все, что вам нужно. Вам не нужно включать аутентификацию, если вы делаете это только для тестирования. Если вам нужна аутентификация, вы можете добавить ее позже.

enter image description here

Ответ 4

Перейти к хранилищу → вкладка "Правила"

Добавь это

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with Google App Engine, this will also make
// files uploaded via GAE public.
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

enter image description here

Ответ 5

Эти решения действительно не решили мою проблему.

что решило мою проблему, так это следующие строки:

в модуле приложения

implementation 'com.google.firebase:firebase-database:15.0.0'
implementation 'com.google.firebase:firebase-storage:15.0.0'
implementation 'com.google.firebase:firebase-auth:15.0.0'

и этот код для загрузки и получения ссылки на скачивание

private void uploadImageToFirebase(Bitmap bmp) {

    try {
        String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                "/news";
        File dir = new File(file_path);
        if (!dir.exists())
            dir.mkdirs();
        File file = new File(dir, "sketchpad" + "_" + ".png");
        FileOutputStream fOut = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        Log.i("SECONDACTIVITY", "ADDED SUCCESSFULLY");

        Uri file2 = Uri.fromFile(file);


        //Now Upload
        final StorageReference storageRef = FirebaseStorage.getInstance().getReference();
        StorageReference riversRef = storageRef.child(file.getName());
        UploadTask uploadTask;
        uploadTask = riversRef.putFile(file2);
        progressDialog.show();
        progressDialog.setCancelable(false);


        uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                progressDialog.incrementProgressBy((int) progress);
            }
        });
        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                progressDialog.dismiss();
                Uri DownloadLink = taskSnapshot.getDownloadUrl();
                String imgUrl = DownloadLink.toString();
                FirebaseDatabase.getInstance().getReference().child("image_link").setValue(imgUrl);
            }
        });
        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
            }
        });


    } catch (IOException e) {
        e.printStackTrace();
    }


}

Ответ 6

service firebase.storage {
  match /b/fir-upload-a2fa6.appspot.com/o {
    match /{allPaths=**} {
      // Allow access by all users
      allow read, write;
    }
  }
}