2016-06-16 4 views
0

Firebase에 일부 이미지를 저장했으며 다운로드하려고 할 때 다음 오류가 발생합니다 : E/StorageException: StorageException has occurred. User does not have permission to access this object. Code: -13021 HttpResult: 403. 나는 Google 인증도 사용하고 있습니다.규칙을 공개로 설정 한 후에도 'StorageException'이 발생합니다. 자세한 내용을 참조하십시오

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

은 알려 주시기 바랍니다 : 여기에

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

보안 규칙을이다 : 나는 그것을 다운로드하려고 방법

다음
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(); 
    } 
}); 

가있다 : 여기

내가 이미지를 업로드하고 방법 이 오류를 제거하고 이미지를 성공적으로 다운로드하려면 어떻게해야합니까?

+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()'를 두 번 호출 해 보셨습니까? –

+0

권한이 있으면 권한을 부여하는 동안 달리 요구하지 않아도됩니다 .... 그래서 두 번 –

+0

@HammadNasir가 문제가 해결 되었습니까? –