2016-04-15 18 views
1

MediaProjectionを使用してscreenshotを撮影しています。これは私がやっていることです。サービスを使用してオーバーレイアイコンを作成しました。オーバーレイアイコンをクリックするとスクリーンショットが撮られます。アプリケーションが戻るボタンを押すか手動でスワイプすることでアプリケーションが終了するたびに、MediaProjectionオブジェクトが失われます.MediaProjectionを維持し、アプリケーションが強制終了されるたびにMediaProjectionを要求しないようにする方法があります。私はすでにthisを見ましたが、私はまだそれを行うことができません。アプリケーションの終了時にMediaProjectionオブジェクトが失われないようにします。

私MainactivityにOnclickは、次のようにstartActivityForResultし、得られonActivityResultが含まれていて、次のように

@Override 
protected void onActivityResult(final int requestCode,final int resultCode,final Intent data) 
{ 
    if (requestCode == requestcode) 
    { 
     if (resultCode == RESULT_OK) 
     { 
      Singelton.setScreenshotPermission((Intent) data.clone()); 
      Singelton.putmanger(mediaProjectionManager); 

     }else if (resultCode==RESULT_CANCELED) { 
      Singelton.setScreenshotPermission(null); 
     } 
    } 
} 

Singeltonクラスがある:オーバーレイアイコンの

protected static void setScreenshotPermission(final Intent permissionIntent) 
{ 
    screenshotPermission = permissionIntent; 
//screenshotPermission becomes null once the application is killed 
} 

public static MediaProjection getData() 
{ 
    return (mediaProjection); 
} 

public static void getScreenshotPermission() 
{ 
    if (screenshotPermission != null) 
    { 
     Log.d("screenshotpermisson", "screenshotPermission != null "); 
     if(mediaProjection!=null) 
     { 
      Log.d("mediaprojection", "mediaprojection != null "); 
      mediaProjection.stop(); 
      mediaProjection = null; 
     } 
     mediaProjection = mediaProjectionManager.getMediaProjection(Activity.RESULT_OK, (Intent) screenshotPermission.clone()); 
    } 
    else 
    { 
    //Here I need to request for media projection again without starting activity 
    } 

} 

私のサービスクラスは次のようにクリックし処理します。

public void createDisplay() 
{ 
    if (mediaProjection == null) 
    { 
     Singelton.getScreenshotPermission(); 
     mediaProjection = Singelton.getData(); 
    } 

    mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 1); 
    vd = mediaProjection.createVirtualDisplay("screen-mirror", width, height, mDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); 
    mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener(){..} 
} 

私はアンドロイドを初めてお使いで、これを理解するのに時間がかかります。

+0

背景に移動するアプリが必ずしも強制終了されるわけではありません。メモリを解放するために殺されるかもしれないし、一時停止されない限り静かに座っているかもしれない。一時停止時にメディアプロジェクションを解放できず、再開時にメディアプロジェクションを再作成できない理由はありますか? – fadden

答えて

1

メディアプロジェクションを、彼のコメントに暗黙のうちに暗黙のうちに再作成してください。サービスが強制終了されるたびに、関連付けられたオーバーレイも一緒に削除されるため、サービスの再起動時にはメディアプロジェクションを再作成する必要があります。

元の意図を消費せず、代わりにここで答えたようなクローンを使用して、すでに罰金をかけています。https://stackoverflow.com/a/33892817/3918978

ただし、許可またはMediaProjectionがもう有効でない場合は、新しいものを取得するだけです(要求するアクティビティを開始してください)。

関連する問題