如何在android viewpager的适配器类中请求权限?

如何在android viewpager的适配器类中请求权限?,android,android-studio,android-viewpager,android-permissions,Android,Android Studio,Android Viewpager,Android Permissions,我正在使用viewpager显示我的应用程序的报价,当用户长按报价时,我希望将报价卡视图保存在设备库中。 因此,我希望在用户长按quote时请求用户写入权限。但是我无法在适配器类中实现权限的方法。可以在适配器类内请求权限吗 我已经实现了将卡视图保存到设备存储中的代码,它工作正常。我必须手动转到设置应用程序并允许该应用程序具有存储权限。 我想在用户长按报价保存报价时检查其权限。我不想在应用加载时请求许可 以下是我的适配器类: public class myAdapter extends Pager

我正在使用viewpager显示我的应用程序的报价,当用户长按报价时,我希望将报价卡视图保存在设备库中。 因此,我希望在用户长按quote时请求用户写入权限。但是我无法在适配器类中实现权限的方法。可以在适配器类内请求权限吗

我已经实现了将卡视图保存到设备存储中的代码,它工作正常。我必须手动转到设置应用程序并允许该应用程序具有存储权限。 我想在用户长按报价保存报价时检查其权限。我不想在应用加载时请求许可

以下是我的适配器类:

public class myAdapter extends PagerAdapter {

    Context context;
    String[] quotes;
    LayoutInflater inflater;
    TextView textView;

    public myAdapter(Context context, String[] quotes) {

        this.context = context;
        this.quotes = quotes;
        inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        return quotes.length;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view==object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {

        View view=inflater.inflate(R.layout.mylayout,container, false );
        container.addView(view);
        textView=view.findViewById(R.id.textView);
        button=view.findViewById(R.id.button);
        final CardView cardView=view.findViewById(R.id.cardView);
        textView.setText(quotes[position]);

        textView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                //I WANT TO ASK FOR STORAGE PERMISSION HERE.

                Bitmap ss=Bitmap.createBitmap(cardView.getWidth(), cardView.getHeight(), Bitmap.Config.ARGB_8888);
                Canvas canvas=new Canvas(ss);
                cardView.draw(canvas);
                MediaStore.Images.Media.insertImage(
                        context.getContentResolver(),
                        ss,
                        "Image",
                        "Captured ScreenShot"
                );

                Toast.makeText(context, "QUOTE SAVED", Toast.LENGTH_LONG).show();
                return false;
            }
        });

        return view;
    }



    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((ViewGroup) object);
    }


}

有这样的听众吗

 interface PermissionAskListener {
        void askPermission(int permission);
    }
并将其传递给适配器

private boolean checkAndRequestPermissions() {

    int Write = ContextCompat.checkSelfPermission(drawerActivity, 
Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int Read = ContextCompat.checkSelfPermission(drawerActivity, 
Manifest.permission.READ_EXTERNAL_STORAGE);

    List<String> listPermissionsNeeded = new ArrayList<>();

    if (Write != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (Read != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(drawerActivity, 
listPermissionsNeeded.toArray
                (new String[listPermissionsNeeded.size()]), 101);
        return false;
    }
    return true;
}
它可以是setter和getter模式,也可以简单地将其添加为构造函数参数

片段
活动
中实现侦听器,并调用
适配器


另外,不要忘记先进行检查,为此,请更改适配器类

public class myAdapter extends PagerAdapter {

Context context;
String[] quotes;
LayoutInflater inflater;
TextView textView;
Button button;

//interface
CallBack callBack;

public myAdapter(Context context, String[] quotes, CallBack callBack) {

    this.context = context;
    this.quotes = quotes;
    this.callBack = callBack;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return quotes.length;
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view == object;
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {

    View view = inflater.inflate(R.layout.mylayout, container, false);
    container.addView(view);
    textView = view.findViewById(R.id.textView);
    button = view.findViewById(R.id.button);

    final CardView cardView = view.findViewById(R.id.cardView);
    textView.setText(quotes[position]);

    textView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            callBack.onLongClick(cardView);
            return false;
        }
    });

    return view;
}


@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((ViewGroup) object);
}

public interface CallBack {
    void onLongClick(CardView cardView);
}

}
您必须创建一个接口,并传递给适配器类以创建事件长时间单击以回调mainactivity和main activity类检查权限,并确认是否保存映像

你的主课

public class MainActivity extends AppCompatActivity {

Cardview cardview;

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

    myAdapter myAdapter = new myAdapter(this, new String[]{"1", "2", "3"}, new myAdapter.CallBack() {
        @Override
        public void onLongClick(CardView cardView) {
            this.cardview = cardview;
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{""}, 200);
        }
    });

}

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

    if (requestCode == 200) {

        Bitmap ss=Bitmap.createBitmap(cardView.getWidth(), cardView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas=new Canvas(ss);
        cardView.draw(canvas);
        MediaStore.Images.Media.insertImage(
                context.getContentResolver(),
                ss,
                "Image",
                "Captured ScreenShot"
        );

        Toast.makeText(context, "QUOTE SAVED", Toast.LENGTH_LONG).show();

        this.cardview = null;

    }

}
}

在你的longClickListener中试试这个

 textView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {

            checkAndRequestPermissions();

            Bitmap ss=Bitmap.createBitmap(cardView.getWidth(), cardView.getHeight(), 
Bitmap.Config.ARGB_8888);
            Canvas canvas=new Canvas(ss);
            cardView.draw(canvas);
            MediaStore.Images.Media.insertImage(
                    context.getContentResolver(),
                    ss,
                    "Image",
                    "Captured ScreenShot"
            );

            Toast.makeText(context, "QUOTE SAVED", Toast.LENGTH_LONG).show();
            return false;
        }
    });
在适配器中添加此方法

private boolean checkAndRequestPermissions() {

    int Write = ContextCompat.checkSelfPermission(drawerActivity, 
Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int Read = ContextCompat.checkSelfPermission(drawerActivity, 
Manifest.permission.READ_EXTERNAL_STORAGE);

    List<String> listPermissionsNeeded = new ArrayList<>();

    if (Write != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (Read != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(drawerActivity, 
listPermissionsNeeded.toArray
                (new String[listPermissionsNeeded.size()]), 101);
        return false;
    }
    return true;
}
private boolean checkAndRequestPermissions(){
int Write=ContextCompat.checkSelfPermission(抽屉实用性,
清单。权限。写入(外部存储);
int Read=ContextCompat.checkSelfPermission(抽屉实用性,
清单。权限。读取(外部存储);
List ListPermissionsNeed=new ArrayList();
if(Write!=已授予PackageManager.PERMISSION){
listPermissionsNeed.add(Manifest.permission.WRITE\u外部存储);
}
如果(读取!=已授予PackageManager.PERMISSION){
listPermissionsNeed.add(Manifest.permission.READ\u外部存储);
}
如果(!ListPermissionsNeed.isEmpty()){
ActivityCompat.requestPermissions(drawerActivity,
列表许可证需要到阵列
(新字符串[ListPermissionsNeed.size()]),101);
返回false;
}
返回true;
}

它成功了。我必须在MainActivity.works中重写的myAdapter.callback()的onLongClick()中用“cardView”替换“this.cardView”,只要用传递上下文替换单词“drawerActivity”。