5

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

+2

Вам нужно будет иметь активность, в которой пользователь может указать, что вы хотите начать запись скриншотов или скринкастов, а оттуда вы можете использовать 'startActivityForResult()'. Я не знаю никаких средств для запроса «MediaProjection», который не включает 'startActivityForResult()'. – CommonsWare

+0

Мне нужно сделать снимок экрана для некоторых конкретных приложений. Поэтому мне приходится обнаруживать приложения из службы и делать снимок экрана с помощью MediaProjection. Приведите пример, если сможете. Я начинающий. Спасибо –

+1

То, что вы хотите, на самом деле невозможно. Пользователь должен участвовать во время начала записи. Кроме того, Google постепенно блокирует способность обнаруживать, что приложение находится на переднем плане. На данный момент (Android 6.0) можно с уверенностью сказать, что если одно приложение может определить, какое другое приложение находится на переднем плане, существует недостаток безопасности, который необходимо устранить. – CommonsWare

ответ

8

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

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> 

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

Для краткого второго по аппликаций n вы снимаете с экрана, потеряете фокус.

Для краткого второго приложение будет на переднем плане приложение, так что не споткнуться собственных шнурков

+1

Чтобы избежать коротких вторых проблем, другой вопрос/ответ @netsplit может работать http://stackoverflow.com/questions/33398211/how-do-i-get-a-media-projection-manager-without-disturbing- the-current-foregroun –

1

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

  1. Local Bound Service: Сделайте свое обслуживание Local Bound Service, что означает, что ваш сервис передаст ссылку на главную деятельность.
  2. передать экземпляр деятельности на службе: Передайте ссылку вашей деятельности на службу в службе Соединения-> onServiceConnected() в классе активность
  3. Вызовите startActivityForResult: Используйте активность Instance в вашем сервисе для вызова функции startActivityForResult.

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

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

+0

, то есть только в том случае, если действие все еще запущено. служба может работать даже тогда, когда нет активности –

Смежные вопросы