首页 > 解决方案 > 为什么读写外部存储在 Fragment Activity 中不起作用?

问题描述

谁能帮助我如何检查片段活动中是否授予了读写外部存储权限?但它不起作用。

即使适用于 Activity,代码也无法通过条件。

StorageReference storageReference;
private static final int IMAGE_REQUEST = 1;
private Uri imageUri;
private StorageTask uploadTask;

private int STORAGE_PERMISSION_CODE = 1;

这是权限检查代码:

String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE};

            if(ContextCompat.checkSelfPermission(getActivity(),
                    permissions[0]) == PackageManager.PERMISSION_GRANTED
                    && ContextCompat.checkSelfPermission(getActivity(),
                    permissions[1]) == PackageManager.PERMISSION_GRANTED){

                openImage();
                Toast.makeText(getActivity(), "Wow", Toast.LENGTH_SHORT).show();

            }

            else{
                requestStoragePermission();
            }

上传方法和覆盖权限方法代码如下链接:

 //Bulid popup for Storagr permission

private void requestStoragePermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
            Manifest.permission.READ_EXTERNAL_STORAGE)) {

        new AlertDialog.Builder(getActivity())
                .setTitle("Permission needed")
                .setMessage("This permission is needed to read your Storage")
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(getActivity(),
                                new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
                    }
                })
                .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .create().show();

    } else {
        ActivityCompat.requestPermissions(getActivity(),
                new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
    }
}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == STORAGE_PERMISSION_CODE)  {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getActivity(), "Permission GRANTED", Toast.LENGTH_SHORT).show();
            openImage();
        } else {
            Toast.makeText(getActivity(), "Permission DENIED", Toast.LENGTH_SHORT).show();
        }
    }
}


//End code for Stroage Permission




//This code for Upload the Image from your Stroage


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 = getActivity().getContentResolver();
    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
    return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}




private void uploadImage(){
    final ProgressDialog pd = new ProgressDialog(getActivity());
    pd.setMessage("Uploading");
    pd.show();

    if (imageUri != null){
        final  StorageReference fileReference = storageReference.child(System.currentTimeMillis()
                +"."+getFileExtension(imageUri));

        uploadTask = fileReference.putFile(imageUri);
        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();
                    mUri = downloadUri.toString();
                    if (upType.equals("Profile"))
                    {

                        reference = FirebaseDatabase.getInstance().getReference("UserInfo").child(userID);
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("image_url", ""+mUri);
                        reference.updateChildren(map);
                        pd.dismiss();
                    }

                    else if (upType.equals("Cover"))
                    {
                        reference = FirebaseDatabase.getInstance().getReference("UserInfo").child(userID);
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("coverUri", ""+mUri);
                        reference.updateChildren(map);
                        pd.dismiss();

                    }

                } else {
                    Toast.makeText(getContext(), "Failed!", Toast.LENGTH_SHORT).show();
                    pd.dismiss();
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                pd.dismiss();
            }
        });
    } else {
        Toast.makeText(getContext(), "No image selected", Toast.LENGTH_SHORT).show();
    }
}

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

    if (requestCode == IMAGE_REQUEST && resultCode == RESULT_OK
            && data != null && data.getData() != null){
        imageUri = data.getData();

        if (uploadTask != null && uploadTask.isInProgress()){
            Toast.makeText(getContext(), "Upload in preogress", Toast.LENGTH_SHORT).show();
        } else {
            uploadImage();
        }
    }
}

标签: androidandroid-permissions

解决方案


推荐阅读