Android MediaProjectionManager в службе

Я хочу создать приложение, в котором я должен использовать MediaProjectionManager в службе. Но я не могу решить это, так как "startActivityForResult" не может использоваться в классе Service.

Ответ 1

Я действительно хочу сделать это из службы, вот как я нашел этот вопрос. Это самое близкое, что я придумал, поэтому просто бросаю его туда, пока не появится лучший ответ. Здесь можно сделать это из активности, которая почти нравится делать из службы:

import static your.package.YourClass.mediaProjectionManager;

public class MainActivity extends Activity {

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(null);
    mediaProjectionManager = (MediaProjectionManager)getContext().getSystemService(MEDIA_PROJECTION_SERVICE);
    startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 1);
    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
            this.finish();
        }
    }
}

Затем в вашем сервисе, когда вам понадобится разрешение на вызов

private void openMainActivity() {
    Intent mainIntent = new Intent(getContext(), MainActivity.class);
    mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(mainIntent);
    }

Чтобы сделать активность невидимой в вашем AndroidManifest.xml

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoDisplay"
        android:excludeFromRecents="true"
        android:screenOrientation="portrait">
    </activity>

Предостережения:

В течение короткой секунды приложение, которое вы снимаете с экрана, потеряет фокус.

В течение короткой секунды ваше приложение будет передним приложением, поэтому не переходите через свои шнурки

Ответ 2

Хорошо, мне удалось сделать это не самым чистым способом, но работает:

  • Служба локальных привязок. Сделайте свою службу Local Bound Service, что означает, что ваша служба передаст ссылку непосредственно к Главной Деятельности.
  • Передача экземпляра активности в службу. Передайте ссылку своей деятельности службе Service Connection- > onServiceConnected() в классе Activity
  • Вызвать startActivityForResult. Используйте экземпляр активности в своей службе для вызова функции startActivityForResult.

Примечание: При вызове startActivityForResult будет обнаружен в onActivityResult() в классе активности. Вам необходимо переопределить эту функцию в Activity и использовать служебную ссылку для возврата в класс обслуживания. Также вы можете отменить действие, начиная со службы после завершения.

Надеюсь, это имеет смысл, извините за отсутствие кода. Если у вас есть какие-либо вопросы, не стесняйтесь помочь вам более подробно.