Мой вопрос может быть лёгким, но я новичок в Android Studio, так что все немного сложнее для меня.Моя проблема в том, что разрабатываемое приложение должно войти в галерею изображений из класса обслуживания, чтобы получить изображение и использовать его в другой функции.Начиная с первого пункта о запросе разрешения.Поскольку разрешение не может быть использовано в Сервисе, я пытаюсь включить его в основное действие, чтобы сделать первое разрешение, а затем сервис может использовать его снова без разрешения.(Интересно, есть ли другие способы решить эту проблему, но пока это нормально.).Следующее, что в Service, я не могу использовать startActivityForResult () и onActivityResult (), чтобы выбрать Image и получить результат.
для моего кода, который я уже выполнил с правами доступа.Мое приложение является плавающим виджетом, поэтому я должен поставить 2 разрешения здесь.
открытый класс MainActivity расширяет AppCompatActivity, реализует View.OnClickListener {
private static final int DRAW_OVER_OTHER_APP_PERMISSION_REQUEST_CODE = 123;
private static final int PHOTO_LIBRARY_REQUEST_CODE_IMAGEVIEW = 122;
private static final int REQUEST_PERMISSION = 12;
private TextView textHelp;
private RelativeLayout rlOverlay;
private Button getPermission;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textHelp = findViewById(R.id.textHelp);
textHelp.setOnClickListener(this);
rlOverlay = findViewById(R.id.rlOverlay);
getPermission = findViewById(R.id.getImagePermission);
getPermission.setOnClickListener(this);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.textHelp:
if (textHelp.getText().toString().equals("Next")) {
textHelp.setText("Got It");
} else {
rlOverlay.setVisibility(View.GONE);
}
break;
case R.id.getImagePermission:
attemptToOpenGallery();
default:
break;
}
}
/* start floating widget service */
public void createFloatingWidget(View view) {
//Check if the application has draw over other apps permission or not?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, DRAW_OVER_OTHER_APP_PERMISSION_REQUEST_CODE);
} else
startFloatingWidgetService();
}
public void attemptToOpenGallery() {
int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123;
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
return;
}
} else {
System.out.println("user already authorized external storage access. Continue");
openImageGallery();
}
}
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted. Continue with image selection
openImageGallery();
} else {
// User refused to grant permission. handle this issue however you wish
}
}
}
public void openImageGallery() {
startActivityForResult(new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI), PHOTO_LIBRARY_REQUEST_CODE_IMAGEVIEW);
}
/* Start Floating widget service and finish current activity */
private void startFloatingWidgetService() {
startService(new Intent(MainActivity.this, FloatingWidgetService.class));
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == DRAW_OVER_OTHER_APP_PERMISSION_REQUEST_CODE) {
//Check if the permission is granted or not.
if (resultCode == RESULT_OK)
//If permission granted start floating widget service
startFloatingWidgetService();
else
//Permission is not available then display toast
Toast.makeText(this,
getResources().getString(R.string.draw_other_app_permission_denied),
Toast.LENGTH_SHORT).show();
} else if (requestCode == PHOTO_LIBRARY_REQUEST_CODE_IMAGEVIEW && resultCode == RESULT_OK && data != null){
Uri mediaUri = data.getData();
System.out.println("Selected media uri: " + mediaUri);
}else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
идля класса обслуживания я пытался поместить функцию openGallery в onFloatingWidgetClick ()
открытый класс FloatingWidgetService расширяет сервис, реализует View.OnClickListener {
private void onFloatingWidgetClick() {
if (isViewCollapsed()) {
// create open gallery without concerning permission
startActivityForResult(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI), PHOTO_LIBRARY_REQUEST_CODE_IMAGEVIEW);
// then get uri from gallery and change it to bitmap
}
}
}
ИтакВ результате я хочу открыть галерею, выбрать изображение и использовать его в классе обслуживания.Есть ли способ?