【问题标题】:How to get WRITE_EXTERNAL_STORAGE Permission in Adapter?如何在适配器中获得 WRITE_EXTERNAL_STORAGE 权限?
【发布时间】:2021-01-27 04:41:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以为此使用回调,并在活动中处理回调并在那里调用 requestPermissions()。
  • 如何使用回调?

标签: android android-studio android-adapter android-download-manager download-manager


【解决方案1】:

在 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);
          }
     }
 }

在网格适配器中你必须编写这些方法

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
           */
     }
}

【讨论】:

  • 我需要创建名为“GridActivity”的新活动吗?因为没有这样的活动
  • 没有。这是一个演示如何使用回调的示例代码,在您的实际代码中,GridActivity 将是您初始化 Grid View 和 GridAdapter.java 的活动/片段
  • 我收到此错误错误:IPermissionCallback is not public in com.punjabidharti.punjabidharticom.activity;无法从外部包访问
  • 你可以创建另一个名为IPermissionCallback.java的java文件并粘贴public interface IPermissionCallback{ void askForStoragePermission(); Boolean checkSelfStoragePermission(); }
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多