5

Desidero creare un'app in cui sia necessario utilizzare MediaProjectionManager in un servizio. Ma non posso risolverlo poiché 'startActivityForResult' non può essere utilizzato nella classe di servizio.Android MediaProjectionManager in servizio

+2

Avresti bisogno di un'attività in cui l'utente possa indicare che vogliono iniziare a registrare schermate o screencast, e da lì puoi usare 'startActivityForResult()'. Non sono a conoscenza di alcun mezzo per richiedere una 'MediaProjection' che non implichi' startActivityForResult() '. – CommonsWare

+0

Devo fare uno screenshot per alcune app specifiche. Quindi devo rilevare le app da un servizio e devo prendere screenshot usando MediaProjection. Per favore, fai un esempio se puoi. Sono un principiante. Grazie –

+1

Quello che vuoi non è davvero possibile. L'utente deve essere coinvolto al momento dell'avvio della registrazione. Inoltre, Google ha progressivamente bloccato la capacità di rilevare quale app è in primo piano. A questo punto (Android 6.0), è sicuro dire che se un'app può determinare quale altra app è in primo piano, è necessario correggere un problema di sicurezza. – CommonsWare

risposta

8

Voglio davvero farlo da un servizio, che è il modo in cui ho trovato questa domanda. Questa è la cosa più vicina a cui mi sono avvicinato, quindi buttale qui, finché non arriva una risposta migliore. Ecco un modo per farlo da un'attività che è quasi come farlo da un servizio:

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(); 
     } 
    } 
} 

Poi, nel tuo servizio quando mai avete bisogno chiamate il permesso

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

Per rendere l'attività invisibile nella vostra AndroidManifest .xml

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

Avvertenze:

Per un breve secondo l'applicatio n stai facendo lo screenshot perderà la concentrazione.

Per un breve secondo la vostra applicazione sarà l'applicazione in primo piano, in modo da non inciampare i propri lacci delle scarpe

+1

Per evitare i brevi secondi problemi, l'altra domanda/risposta di @netsplit potrebbe funzionare http://stackoverflow.com/questions/33398211/how-do-i-get-a-media-project-manager-without-disturbing- the-current-foregroun –

1

Ok, sono riuscito a fare questo la sua non il più pulito di modi, ma funziona:

  1. Servizio Bound locale: Effettuare il servizio a Local Bound Service, il che significa che il servizio passerà un riferimento di se stesso all'attività principale.
  2. passare un'istanza della attività al Servizio: Passare il riferimento della vostra attività al servizio del Servizio Connection-> onServiceConnected() nella classe di attività
  3. chiamata la startSubActivity: svolgere l'attività per istanza nel tuo servizio per chiamare la funzione startActivityForResult.

Nota: Dopo essere stato chiamato lo startSubActivity sarà preso in onActivityResult() nella classe di attività. Sarà necessario sovrascrivere questa funzione nell'attività e utilizzare il riferimento al servizio per tornare alla classe di servizio. Inoltre, puoi annullare l'attività, dal servizio al completamento.

Spero che questo abbia senso, mi dispiace per non aver incluso alcun codice. Se avete domande, vi preghiamo di aiutarvi in ​​ulteriori dettagli.

+0

che è solo se l'attività è ancora in esecuzione. un servizio può essere eseguito anche in assenza di attività –