如何在适配器中获得 WRITE_EXTERNAL_STORAGE 权限?

问题描述

我想从远程 url 下载图像,我需要获得用户权限才能保存图像,但我无法在 GridAdapter.java 文件中执行此操作,这在适配器中不起作用:

requestPermissions((Activity) context,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},DOWNLOAD_REQUEST_CODE);

我已经尝试了许多互联网上可用的方法,但似乎没有任何效果,

喜欢ActivityCompat.requestPermissions(context,DOWNLOAD_REQUEST_CODE);

 requestPermissions((Activity) context.getApplicationContext(),DOWNLOAD_REQUEST_CODE);

解决方法

在GridActivity类中创建接口并在GridAdapter类中实现

interface IPermissionCallback{
    void askForStoragePermission();
    Boolean checkSelfStoragePermission();
}

public class GridActivity extends AppCompatActivity implements 
    IPermissionCallback {

    private static final int DOWNLOAD_REQUEST_CODE = 1001;
    private GridAdapter adapter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState,@Nullable 
        PersistableBundle persistentState) {
        super.onCreate(savedInstanceState,persistentState);
    
        //other codes...
        //initialize GridAdapter here and then call setPermissionCallback() 
        //method as shown below
        adapter.setPermissionCallback(this);
    }


    @Override
    public void askForStoragePermission() {
        requestPermissions(new String[] 
        {android.Manifest.permission.WRITE_EXTERNAL_STORAGE},DOWNLOAD_REQUEST_CODE);
    }

    @Override
    public Boolean checkSelfStoragePermission() {
    
        if(checkCallingOrSelfPermission(
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == 
            PackageManager.PERMISSION_GRANTED){
                return true;
        }
        return false;
    }


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

          if (requestCode == DOWNLOAD_REQUEST_CODE 
          && grantResults[0] == PackageManager.PERMISSION_GRANTED){
               //permission granted update GridAdapter to do next task
               adapter.onPermissionResult(true);
          }else{
               //permission denied update GridAdapter to do next task
               adapter.onPermissionResult(false);
          }
     }
 }

在 Grid Adapter 中你必须编写这些方法

public class GridAdapter/**extends needed classes etc.*/{
     private IPermissionCallback callback;


     public void yourMethodWhereYouDownloadingImg(){
         if (callback != null && callback.checkSelfStoragePermission()){
             //already permission is granted
         }else{
            callback.askForStoragePermission();
         }
     }

     public void setPermissionCallback(IPermissionCallback c){
         this.callback = c;
     }

     public void onPermissionResult(Boolean permissionGranted){
         /**
           * if @permissionGranted is true download image else inform user 
             that permission is denied
           */
     }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...