Можем ли мы открыть галерею изображений в классе обслуживания?(и получить данные изображения) - PullRequest
0 голосов
/ 08 апреля 2019

Мой вопрос может быть лёгким, но я новичок в 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

    }
}

}

ИтакВ результате я хочу открыть галерею, выбрать изображение и использовать его в классе обслуживания.Есть ли способ?

...