Разрешение отклонено при выборе изображенияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Разрешение отклонено при выборе изображения

Сообщение Anonymous »

Я пытался использовать Firebase Storage, чтобы изменить изображение профиля, выбрав одно из устройств и загрузив его, но когда я нажимаю кнопку «Выбрать изображение», я получаю сообщение об ошибке «Отказано в разрешении. Невозможно выбрать изображение». Кто-то может это сделать. помогите мне заранее спасибо.

Код: Выделить всё

package it.unich.s3221238.tesi;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.bumptech.glide.Glide;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;

public class ProfileActivity extends AppCompatActivity {

private static final int PICK_IMAGE_REQUEST = 1;
private static final int REQUEST_PERMISSION_CODE = 2;
private static final int EDIT_PROFILE_REQUEST = 3;
private static final String TAG = "ProfileActivity";

private TextView profileName, profileEmail, profileUsername;
private ImageView profileImg;
private Button selectImageButton, uploadImageButton, editProfile, homeButton;
private Uri imageUri;
private String currentUsername;
private StorageReference storageReference;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);

profileName = findViewById(R.id.profileName);
profileEmail = findViewById(R.id.profileEmail);
profileUsername = findViewById(R.id.profileUsername);
profileImg = findViewById(R.id.profileImg);
selectImageButton = findViewById(R.id.selectImageButton);
uploadImageButton = findViewById(R.id.uploadImageButton);
editProfile = findViewById(R.id.editButton);
homeButton = findViewById(R.id.homeButton);

storageReference = FirebaseStorage.getInstance().getReference();

showAllUserData();

editProfile.setOnClickListener(v -> passUserData());
homeButton.setOnClickListener(v -> finish());

selectImageButton.setOnClickListener(v -> {
if (ContextCompat.checkSelfPermission(ProfileActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(ProfileActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
} else {
openImagePicker();
}
});

uploadImageButton.setOnClickListener(v -> {
if (imageUri != null) {
uploadImageToFirebase();
} else {
Toast.makeText(ProfileActivity.this, "Please select an image first", Toast.LENGTH_SHORT).show();
}
});
}

private void showAllUserData() {
Intent intent = getIntent();
String nameUser = intent.getStringExtra("name");
String emailUser = intent.getStringExtra("email");
String usernameUser = intent.getStringExtra("username");

profileName.setText(nameUser);
profileEmail.setText(emailUser);
profileUsername.setText(usernameUser);
currentUsername = usernameUser;

loadProfileImage();   // Load the profile image if available
}

private void passUserData() {
String userUsername = profileUsername.getText().toString().trim();

DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users");
Query checkUserDatabase = reference.orderByChild("username").equalTo(userUsername);

checkUserDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
String nameFromDB = snapshot.child(userUsername).child("name").getValue(String.class);
String emailFromDB = snapshot.child(userUsername).child("email").getValue(String.class);
String usernameFromDB = snapshot.child(userUsername).child("username").getValue(String.class);

Intent intent = new Intent(ProfileActivity.this, EditProfileActivity.class);
intent.putExtra("name", nameFromDB);
intent.putExtra("email", emailFromDB);
intent.putExtra("username", usernameFromDB);

startActivityForResult(intent, EDIT_PROFILE_REQUEST);
}
}

@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.e(TAG, "Database error: ", error.toException());
}
});
}

private void openImagePicker() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, PICK_IMAGE_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
imageUri = data.getData();
profileImg.setImageURI(imageUri); // Show the selected image immediately
Toast.makeText(ProfileActivity.this, "Image selected", Toast.LENGTH_SHORT).show();
}

if (requestCode == EDIT_PROFILE_REQUEST && resultCode == RESULT_OK && data != null) {
String updatedName = data.getStringExtra("name");
String updatedEmail = data.getStringExtra("email");
String updatedUsername = data.getStringExtra("username");

profileName.setText(updatedName);
profileEmail.setText(updatedEmail);
profileUsername.setText(updatedUsername);
}
}

private void uploadImageToFirebase() {
if (imageUri != null) {
String filePath = "profile_images/" + currentUsername + ".jpg";
Log.d(TAG, "Uploading image to path: " + filePath);

StorageReference profileImageRef = storageReference.child(filePath);

profileImageRef.putFile(imageUri)
.addOnSuccessListener(taskSnapshot -> profileImageRef.getDownloadUrl().addOnSuccessListener(uri -> {
Glide.with(ProfileActivity.this)
.load(uri)
.placeholder(R.drawable.akwhitelogo)
.into(profileImg);
Toast.makeText(ProfileActivity.this, "Image uploaded successfully", Toast.LENGTH_SHORT).show();
}))
.addOnFailureListener(e -> {
Toast.makeText(ProfileActivity.this, "Image upload failed: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Log.e(TAG, "Upload error: ", e);
});
} else {
Toast.makeText(ProfileActivity.this, "No image selected", Toast.LENGTH_SHORT).show();
}
}

private void loadProfileImage() {
if (currentUsername != null) {
String filePath = "profile_images/" + currentUsername + ".jpg";
Log.d(TAG, "Loading image from path: " + filePath);

StorageReference profileImageRef = storageReference.child(filePath);

profileImageRef.getDownloadUrl().addOnSuccessListener(uri ->  {
Glide.with(ProfileActivity.this)
.load(uri)
.placeholder(R.drawable.akwhitelogo)
.into(profileImg);
}).addOnFailureListener(e -> {
profileImg.setImageResource(R.drawable.akwhitelogo);
Log.e(TAG, "Failed to load profile image: ", e);
});
} else {
profileImg.setImageResource(R.drawable.akwhitelogo);
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openImagePicker();
} else {
Toast.makeText(this, "Permission denied.  Unable to select image.", Toast.LENGTH_SHORT).show();
}
}
}
}
Это класс моего профиля, ошибок нет А это манифест.
Это ошибка logcat:

Код: Выделить всё

 StorageException has occurred.
Object does not exist at location.
Code: -13010 HttpResult: 404
2024-08-05 00:37:28.761 10819-10855 StorageException        it.unich.s3221238.tesi               E  {  "error": {    "code": 404,    "message": "Not Found."  }}
java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found."   }}
at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:415)
at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:432)
at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:423)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:265)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:282)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:76)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:68)
at com.google.firebase.storage.GetDownloadUrlTask.run(GetDownloadUrlTask.java:77)
at com.google.firebase.concurrent.LimitedConcurrencyExecutor.lambda$decorate$0$com-google-firebase-concurrent-LimitedConcurrencyExecutor(LimitedConcurrencyExecutor.java:65)
at com.google.firebase.concurrent.LimitedConcurrencyExecutor$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0$com-google-firebase-concurrent-CustomThreadFactory(CustomThreadFactory.java:47)
at com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.lang.Thread.run(Thread.java:1012)
2024-08-05 00:37:28.794 10819-10819 WindowOnBackDispatcher  it.unich.s3221238.tesi               W  sendCancelIfRunning: isInProgress=falsecallback=ImeCallback=ImeOnBackInvokedCallback@236402277 Callback=android.window.IOnBackInvokedCallback$Stub$Proxy@5213cd
2024-08-05 00:37:28.911 10819-10819 ProfileActivity         it.unich.s3221238.tesi               E  Failed to load profile image:
com.google.firebase.storage.StorageException:  Object does not exist at location.
at com.google.firebase.storage.network.NetworkRequest.completeTask(NetworkRequest.java:509)
at com.google.firebase.storage.GetDownloadUrlTask.run(GetDownloadUrlTask.java:85)
at com.google.firebase.concurrent.LimitedConcurrencyExecutor.lambda$decorate$0$com-google-firebase-concurrent-LimitedConcurrencyExecutor(LimitedConcurrencyExecutor.java:65)
at com.google.firebase.concurrent.LimitedConcurrencyExecutor$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0$com-google-firebase-concurrent-CustomThreadFactory(CustomThreadFactory.java:47)
at com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.lang.Thread.run(Thread.java:1012)
Caused by: java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found."   }}
at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:415)
at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:432)
at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:423)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:265)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:282)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:76)
at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:68)
at com.google.firebase.storage.GetDownloadUrlTask.run(GetDownloadUrlTask.java:77)
at com.google.firebase.concurrent.LimitedConcurrencyExecutor.lambda$decorate$0$com-google-firebase-concurrent-LimitedConcurrencyExecutor(LimitedConcurrencyExecutor.java:65) 
at com.google.firebase.concurrent.LimitedConcurrencyExecutor$$ExternalSyntheticLambda0.run(Unknown Source:4) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) 
at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0$com-google-firebase-concurrent-CustomThreadFactory(CustomThreadFactory.java:47) 
at com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0.run(Unknown Source:4) 
at java.lang.Thread.run(Thread.java:1012) 
Я новичок в Firebase, спасибо за ваше терпение.

Подробнее здесь: https://stackoverflow.com/questions/788 ... g-an-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»