Я недавно сделал это, чтобы пользователи могли выбрать изображение из своей фотогалереи или загрузок и загрузить его в Firebase Storage и использовать изображение в качестве картинки своего профиля.
Проблема в том, что когда пользователь заходит в свою галерею, все фотографии отображаются серым цветом, поэтому они не могут выбрать их для загрузки. Я предполагаю, что это проблема с разрешениями, но я считаю, что у меня есть все необходимые разрешения, чтобы избежать этой проблемы. Этот код используется для открытия галереи, выбора фотографии и загрузки фотографии в хранилище Firebase
public class AccountSettings extends AppCompatActivity {
StorageReference storageReference;
private static final int IMAGE_REQUEST = 1;
private StorageTask uploadTask;
private Uri profileImage;
private void openImage() {
Intent intent = new Intent();
intent.setType("image/");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, IMAGE_REQUEST);
}
private String getFileExtension(Uri uri) {
ContentResolver contentResolver = AccountSettings.this.getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
return mimeTypeMap.getMimeTypeFromExtension(contentResolver.getType(uri));
}
private void uploadImage() {
final ProgressDialog pd = new ProgressDialog(AccountSettings.this);
pd.setMessage("Uploading");
pd.show();
if (profileImage != null) {
final StorageReference fileReference = storageReference.child(System.currentTimeMillis() + "." + getFileExtension(profileImage));
uploadTask = fileReference.putFile(profileImage);
uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return fileReference.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
String mUri = downloadUri.toString();
HashMap<String, Object> map = new HashMap<>();
map.put("imageURL", mUri);
HomePage.myRef.updateChildren(map);
pd.dismiss();
} else {
Toast.makeText(AccountSettings.this, "FAILED!!", Toast.LENGTH_SHORT).show();
pd.dismiss();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(AccountSettings.this, e.getMessage(), Toast.LENGTH_SHORT).show();
pd.dismiss();
}
});
} else {
Toast.makeText(AccountSettings.this, "No image selected", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null) {
profileImage = data.getData();
if (uploadTask != null && uploadTask.isInProgress()) {
Toast.makeText(AccountSettings.this, "Upload in progress", Toast.LENGTH_SHORT).show();
} else {
uploadImage();
}
}
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
}
И это те разрешения, которые у меня есть в моем Манифесте, чтобы позволить пользователям выбирать изображения - я думаю, что проблема здесь, но я не уверен
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Я не знаю, почему изображения не выбираются