2016-06-16 5 views
0

Firebaseにいくつかの画像を保存しましたが、ダウンロードしようとしているときにエラーが発生しています:E/StorageException: StorageException has occurred. User does not have permission to access this object. Code: -13021 HttpResult: 403私もGoogle認証を使用しています。ここでルールをパブリックとして設定しても、 'StorageException'が発生します。詳細を参照してください

は、私は、画像をアップロードしています方法は次のとおりです。

StorageReference storageReference = firebaseStorage.getReferenceFromUrl("gs://appname-e2a32.appspot.com").child("hImage"); 

UploadTask uploadTask = storageReference.putBytes(data); 
uploadTask.addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception exception) { 
     Toast.makeText(getBaseContext(), exception.getMessage(), Toast.LENGTH_SHORT).show(); 
     // Handle unsuccessful uploads 
    } 
}).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(); 
     savingHelpRequest.dismiss(); 
     Toast.makeText(getBaseContext(), "image uploaded", Toast.LENGTH_SHORT).show(); 
    } 
}); 

は、ここで私はそれをダウンロードしようとしている方法は次のとおりです。

FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(); 

storageReference = firebaseStorage.getReferenceFromUrl("gs://appname-e2a32.appspot.com").child("hImage"); 

storageReference.getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
    @Override 
    public void onSuccess(byte[] bytes) { 
     // Use the bytes to display the image 
     ByteArrayOutputStream baoStream = new ByteArrayOutputStream(); 
     bytes = baoStream.toByteArray(); 
     bmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

    } 
    }).addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception exception) { 
     // Handle any errors 
     Toast.makeText(getBaseContext(), exception.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
}); 

は、ここでセキュリティルールです:

service firebase.storage { 
    match /b/appname-e2a32.appspot.com/o { 
    match /{allPaths=**} { 
    allow read, write; 
    } 
} 
} 

私に知らせてくださいこのエラーを取り除き、イメージを正常にダウンロードするにはどうすればよいですか?

+1

Firebase認証を使用しているか、認証されていないアクセスを許可するようにデフォルトのストレージセキュリティルールを変更していますか? –

+0

セキュリティルールの編集された質問を参照してください。はい私はGoogle認証を使用しています。 –

+0

あなたは6.0に対してコンパイルしていますか? –

答えて

0

Android 6.0またはAPI 23では、ユーザーからの実行時アクセス許可を取得する必要があります。マニフェストでのアクセス許可の宣言だけでは不十分です。

public class SampleActivity extends AppCompatActivity { 
     private static final int REQUEST_RUNTIME_PERMISSION = 1; 


     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_login); 
      checkPremission(); 
      //SomeTask(); which need permission will become like below in API 23 
     } 

     void checkPremission() { 
      //select which permission you want 
      final String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE; 
      if (ContextCompat.checkSelfPermission(SampleActivity.this, permission) 
        != PackageManager.PERMISSION_GRANTED) { 
       if (ActivityCompat.shouldShowRequestPermissionRationale(SampleActivity.this, permission)) { 
       } else { 
        ActivityCompat.requestPermissions(SampleActivity.this, new String[]{permission}, REQUEST_RUNTIME_PERMISSION); 
       } 
      } else { 
       // you have permission go ahead launch service 
       SomeTask(); 
      } 
     } 

     @Override 
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
      switch (requestCode) { 
       case REQUEST_RUNTIME_PERMISSION: 
        final int numOfRequest = grantResults.length; 
        final boolean isGranted = numOfRequest == 1 
          && PackageManager.PERMISSION_GRANTED == grantResults[numOfRequest - 1]; 
        if (isGranted) { 
         // you have permission go ahead 
         SomeTask(); 
        } else { 
         // you dont have permission show toast 
        } 
        break; 
       default: 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
      } 
     } 


     void SomeTask() { 
      FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(); 
      storageReference = firebaseStorage.getReferenceFromUrl("gs://appname-e2a32.appspot.com"); 
      storageReference.getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
       @Override 
       public void onSuccess(byte[] bytes) { 
        // Use the bytes to display the image 
        ByteArrayOutputStream baoStream = new ByteArrayOutputStream(); 
        bytes = baoStream.toByteArray(); 
        bmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
       } 
      }).addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception exception) { 
        // Handle any errors 
        Toast.makeText(getBaseContext(), exception.getMessage(), Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 
    } 
+0

なぜあなたは 'SomeTask()'を2回呼び出しましたか? –

+0

もしあなたが許可を持っていれば、許諾を与えている間は、そうでなければ何かを頼む必要はありません....だから、なぜ2回 –

+0

@ HammadNasirはあなたの問題が修正されていますか? –

関連する問題