这是我的清单文件权限。已经添加了 android 13 所需的权限代码但不起作用
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!--<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
我的java文件.i已经添加了必要的代码来从手机中选择图像,但不幸的是在android 13中无法工作......................................... ...................................................... ...................................................... ......................................
package com.virlabs.filmytube.ui.activities;
import java.io.File;
public class EditActivity extends AppCompatActivity implements ProgressRequestBody.UploadCallbacks{
private PrefManager prf;
private CircleImageView image_view_edit_activity_user_profile;
private TextView text_view_edit_activity_name_user;
private ImageView image_view_edit_activity_name_edit_photo;
private RelativeLayout relative_layout_edit_activity_save;
private TextInputLayout text_input_layout_activity_edit_name;
private TextInputEditText text_input_editor_text_activity_edit_name;
private int id;
private String name;
private String image;
private int PICK_IMAGE = 1557;
private String imageUrl;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
Bundle bundle = getIntent().getExtras() ;
this.id = bundle.getInt("id");
this.name = bundle.getString("name");
this.image = bundle.getString("image");
this.prf = new PrefManager(getApplicationContext());
initView();
initAction();
setUser();
}
private boolean validatName() {
if (text_input_editor_text_activity_edit_name.getText().toString().trim().isEmpty() || text_input_editor_text_activity_edit_name.getText().length() < 3 ) {
text_input_layout_activity_edit_name.setError(getString(R.string.error_short_value));
requestFocus(text_input_editor_text_activity_edit_name);
return false;
} else {
text_input_layout_activity_edit_name.setErrorEnabled(false);
}
return true;
}
private void requestFocus(View view) {
if (view.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
private void initView() {
this.image_view_edit_activity_user_profile = (CircleImageView) findViewById(R.id.image_view_edit_activity_user_profile);
this.image_view_edit_activity_name_edit_photo = (ImageView) findViewById(R.id.image_view_edit_activity_name_edit_photo);
this.text_view_edit_activity_name_user = (TextView) findViewById(R.id.text_view_edit_activity_name_user);
this.relative_layout_edit_activity_save= (RelativeLayout) findViewById(R.id.relative_layout_edit_activity_save);
this.text_input_editor_text_activity_edit_name= (TextInputEditText) findViewById(R.id.text_input_editor_text_activity_edit_name);
this.text_input_layout_activity_edit_name= (TextInputLayout) findViewById(R.id.text_input_layout_activity_edit_name);
pd = new ProgressDialog(EditActivity.this);
pd.setMessage("Updating my user infos");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setCancelable(false);
}
private void initAction() {
this.relative_layout_edit_activity_save.setOnClickListener( v -> {
submit();
});
this.image_view_edit_activity_name_edit_photo.setOnClickListener(v->{
SelectImage();
});
}
private void submit() {
if (!validatName())
return;
edit();
}
private void setUser() {
this.text_input_editor_text_activity_edit_name.setText(name);
this.text_view_edit_activity_name_user.setText(name);
Picasso.get()
.load(image)
.error(R.drawable.placeholder_profile)
.placeholder(R.drawable.placeholder_profile)
.into(image_view_edit_activity_user_profile);
}
private void SelectImage() {
if (ContextCompat.checkSelfPermission(EditActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(EditActivity.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE }, 0);
}else{
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, PICK_IMAGE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 0: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
SelectImage();
}
return;
}
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK
&& null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Video.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
imageUrl = picturePath ;
File file = new File(imageUrl);
Picasso.get()
.load(file)
.error(R.drawable.placeholder_profile)
.placeholder(R.drawable.placeholder_profile)
.into(image_view_edit_activity_user_profile);
} else {
Log.i("SonaSys", "resultCode: " + resultCode);
switch (resultCode) {
case 0:
Log.i("SonaSys", "User cancelled");
break;
case -1:
break;
}
}
}
public void edit() {
pd.show();
PrefManager prf = new PrefManager(getApplicationContext());
Retrofit retrofit = apiClient.getClient();
apiRest service = retrofit.create(apiRest.class);
MultipartBody.Part body = null;
if (imageUrl != null){
File file1 = new File(imageUrl);
int file_size = Integer.parseInt(String.valueOf(file1.length() / 1024 / 1024));
if (file_size > 20) {
Toasty.error(getApplicationContext(), "Max file size allowed 20M", Toast.LENGTH_LONG).show();
}
Log.v("SIZE", file1.getName() + "");
final File file = new File(imageUrl);
ProgressRequestBody requestFile = new ProgressRequestBody(file, EditActivity.this);
body = MultipartBody.Part.createFormData("uploaded_file", file.getName(), requestFile);
}
String id_ser= prf.getString("ID_USER");
String key_ser= prf.getString("TOKEN_USER");
Call<ApiResponse> request = service.editProfile(body, Integer.parseInt(id_ser), key_ser, text_input_editor_text_activity_edit_name.getText().toString().trim());
request.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
if (response.isSuccessful()){
Toasty.success(getApplication(),getResources().getString(R.string.infos_updated_successfully),Toast.LENGTH_LONG).show();
for (int i=0;i<response.body().getValues().size();i++) {
if (response.body().getValues().get(i).getName().equals("name")) {
String Newname = response.body().getValues().get(i).getValue();
if (Newname != null) {
if (!Newname.isEmpty()) {
prf.setString("NAME_USER",Newname);
}
}
}
if (response.body().getValues().get(i).getName().equals("url")) {
String NewImage = response.body().getValues().get(i).getValue();
if (NewImage != null) {
if (!NewImage.isEmpty()) {
prf.setString("IMAGE_USER",NewImage);
}
}
}
}
finish();
}else{
Toasty.error(getApplication(),getResources().getString(R.string.error_server),Toast.LENGTH_LONG).show();
}
pd.dismiss();
pd.cancel();
}
@Override
public void onFailure(Call<ApiResponse> call, Throwable t) {
Toasty.error(getApplication(),getResources().getString(R.string.error_server),Toast.LENGTH_LONG).show();
pd.dismiss();
pd.cancel();
}
});
}
@Override
public void onProgressUpdate(int percentage) {
pd.setProgress(percentage);
}
@Override
public void onError() {
pd.dismiss();
pd.cancel();
}
@Override
public void onFinish() {
pd.dismiss();
pd.cancel();
}
}
试试这个代码
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
public Uri uri = null;
private static final int PICK_IMAGE_REQUEST = 1, PICK_VIDEO_REQUEST = 2;
private void selectImage() {
final CharSequence[] options = {"Photos", "Videos", "Cancel"};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Choose Photo/Video");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (options[item].equals("Photos")) {
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_MEDIA_IMAGES) == PackageManager.PERMISSION_GRANTED) {
Intent photos = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(photos, PICK_IMAGE_REQUEST);
} else if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_MEDIA_IMAGES))) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Toast.makeText(MainActivity.this, "Image permission required", Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_MEDIA_IMAGES}, PICK_IMAGE_REQUEST);
}
} else if (options[item].equals("Videos")) {
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_MEDIA_VIDEO) == PackageManager.PERMISSION_GRANTED) {
Intent video = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(video, PICK_VIDEO_REQUEST);
} else if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_MEDIA_VIDEO))) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Toast.makeText(MainActivity.this, "Video permission required", Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_MEDIA_VIDEO}, PICK_VIDEO_REQUEST);
}
} else if (options[item].equals("Cancel")) {
dialog.dismiss();
}
} else {
if (options[item].equals("Photos")) {
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Intent photos = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(photos, PICK_IMAGE_REQUEST);
} else if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Toast.makeText(MainActivity.this, "Gallery Permission required", Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PICK_IMAGE_REQUEST);
}
} else if (options[item].equals("Videos")) {
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Intent video = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(video, PICK_VIDEO_REQUEST);
} else if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Toast.makeText(MainActivity.this, "Gallery Permission required", Toast.LENGTH_SHORT).show();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PICK_VIDEO_REQUEST);
}
} else if (options[item].equals("Cancel")) {
dialog.dismiss();
}
}
}
});
builder.show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PICK_IMAGE_REQUEST) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent photos = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(photos, PICK_IMAGE_REQUEST);
Toast.makeText(MainActivity.this, "Image Permission Granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Image Permission Denied", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == PICK_VIDEO_REQUEST) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent video = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(video, PICK_VIDEO_REQUEST);
Toast.makeText(MainActivity.this, "Video Permission Granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Video Permission Denied", Toast.LENGTH_SHORT).show();
}
}
}
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == PICK_IMAGE_REQUEST) {
assert data != null;
// get selected Image Uri;
uri = data.getData();
} else if (resultCode == RESULT_OK && requestCode == PICK_VIDEO_REQUEST) {
assert data != null;
// get selected Image Uri;
uri = data.getData();
}
}
我使用此代码。但是当我单击图像选取按钮时显示权限被拒绝错误
public class EditActivity extends AppCompatActivity implements ProgressRequestBody.UploadCallbacks {
private PrefManager prf;
private CircleImageView image_view_edit_activity_user_profile;
private TextView text_view_edit_activity_name_user;
private ImageView image_view_edit_activity_name_edit_photo;
private RelativeLayout relative_layout_edit_activity_save;
private TextInputLayout text_input_layout_activity_edit_name;
private TextInputEditText text_input_editor_text_activity_edit_name;
private int id;
private String name;
private String image;
private int PICK_IMAGE = 1557;
private String imageUrl;
private ProgressDialog pd;
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
if (isGranted) {
// Permission has been granted, proceed with image selection
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, PICK_IMAGE);
} else {
// Permission denied, show a message or handle accordingly
Toast.makeText(EditActivity.this, "Permission denied", Toast.LENGTH_SHORT).show();
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
Bundle bundle = getIntent().getExtras();
this.id = bundle.getInt("id");
this.name = bundle.getString("name");
this.image = bundle.getString("image");
this.prf = new PrefManager(getApplicationContext());
initView();
initAction();
setUser();
}
private boolean validateName() {
if (text_input_editor_text_activity_edit_name.getText().toString().trim().isEmpty() || text_input_editor_text_activity_edit_name.getText().length() < 3) {
text_input_layout_activity_edit_name.setError(getString(R.string.error_short_value));
requestFocus(text_input_editor_text_activity_edit_name);
return false;
} else {
text_input_layout_activity_edit_name.setErrorEnabled(false);
}
return true;
}
private void requestFocus(View view) {
if (view.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
private void initView() {
this.image_view_edit_activity_user_profile = findViewById(R.id.image_view_edit_activity_user_profile);
this.image_view_edit_activity_name_edit_photo = findViewById(R.id.image_view_edit_activity_name_edit_photo);
this.text_view_edit_activity_name_user = findViewById(R.id.text_view_edit_activity_name_user);
this.relative_layout_edit_activity_save = findViewById(R.id.relative_layout_edit_activity_save);
this.text_input_editor_text_activity_edit_name = findViewById(R.id.text_input_editor_text_activity_edit_name);
this.text_input_layout_activity_edit_name = findViewById(R.id.text_input_layout_activity_edit_name);
pd = new ProgressDialog(EditActivity.this);
pd.setMessage("Updating my user infos");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setCancelable(false);
}
private void initAction() {
this.relative_layout_edit_activity_save.setOnClickListener(v -> {
submit();
});
this.image_view_edit_activity_name_edit_photo.setOnClickListener(v -> {
if (ContextCompat.checkSelfPermission(EditActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
} else {
SelectImage();
}
});
}
private void submit() {
if (!validateName())
return;
edit();
}
private void setUser() {
this.text_input_editor_text_activity_edit_name.setText(name);
this.text_view_edit_activity_name_user.setText(name);
Picasso.get()
.load(image)
.error(R.drawable.placeholder_profile)
.placeholder(R.drawable.placeholder_profile)
.into(image_view_edit_activity_user_profile);
}
private void SelectImage() {
if (ContextCompat.checkSelfPermission(EditActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
} else {
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, PICK_IMAGE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PICK_IMAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
SelectImage();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && data != null) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
imageUrl = picturePath;
File file = new File(imageUrl);
Picasso.get()
.load(file)
.error(R.drawable.placeholder_profile)
.placeholder(R.drawable.placeholder_profile)
.into(image_view_edit_activity_user_profile);
}
}
}
public void edit() {
pd.show();
PrefManager prf = new PrefManager(getApplicationContext());
Retrofit retrofit = apiClient.getClient();
apiRest service = retrofit.create(apiRest.class);
MultipartBody.Part body = null;
if (imageUrl != null) {
File file1 = new File(imageUrl);
int file_size = Integer.parseInt(String.valueOf(file1.length() / 1024 / 1024));
if (file_size > 20) {
Toasty.error(getApplicationContext(), "Max file size allowed 20M", Toast.LENGTH_LONG).show();
}
final File file = new File(imageUrl);
ProgressRequestBody requestFile = new ProgressRequestBody(file, EditActivity.this);
body = MultipartBody.Part.createFormData("uploaded_file", file.getName(), requestFile);
}
String id_ser = prf.getString("ID_USER");
String key_ser = prf.getString("TOKEN_USER");
Call<ApiResponse> request = service.editProfile(body, Integer.parseInt(id_ser), key_ser, text_input_editor_text_activity_edit_name.getText().toString().trim());
request.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(Call<ApiResponse> call, Response<ApiResponse> response) {
if (response.isSuccessful()) {
Toasty.success(getApplication(), getResources().getString(R.string.infos_updated_successfully), Toast.LENGTH_LONG).show();
for (int i = 0; i < response.body().getValues().size(); i++) {
if (response.body().getValues().get(i).getName().equals("name")) {
String Newname = response.body().getValues().get(i).getValue();
if (Newname != null && !Newname.isEmpty()) {
prf.setString("NAME_USER", Newname);
}
}
if (response.body().getValues().get(i).getName().equals("url")) {
String NewImage = response.body().getValues().get(i).getValue();
if (NewImage != null && !NewImage.isEmpty()) {
prf.setString("IMAGE_USER", NewImage);
}
}
}
finish();
} else {
Toasty.error(getApplication(), getResources().getString(R.string.error_server), Toast.LENGTH_LONG).show();
}
pd.dismiss();
}
@Override
public void onFailure(Call<ApiResponse> call, Throwable t) {
Toasty.error(getApplication(), getResources().getString(R.string.error_server), Toast.LENGTH_LONG).show();
pd.dismiss();
}
});
}
@Override
public void onProgressUpdate(int percentage) {
pd.setProgress(percentage);
}
@Override
public void onError() {
pd.dismiss();
}
@Override
public void onFinish() {
pd.dismiss();
}
}