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