服务中的Android MediaProjectionManager

fah*_*ust 8 service android broadcastreceiver android-mediaprojection

我想构建一个应用程序,我必须在服务中使用MediaProjectionManager.但我无法解决它,因为'startActivityForResult'不能在Service类中使用.

net*_*lit 11

我真的想从服务中做到这一点,这就是我发现这个问题的方法.这是我最接近的,所以把它扔到那里,直到更好的答案出现.这是一种从一项活动中做到这一点的方法,这种活动几乎就像是从服务中做到的:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的服务中,当您需要许可电话时

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

在AndroidManifest.xml中使活动不可见

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoDisplay"
        android:excludeFromRecents="true"
        android:screenOrientation="portrait">
    </activity>
Run Code Online (Sandbox Code Playgroud)

注意事项:

短暂的一秒,您正在屏幕上的应用程序将失去焦点.

短暂的一秒,你的应用程序将是前台应用程序,所以不要绊倒你​​自己的鞋带

  • 为了避免短暂的第二个问题,@netsplit的其他问题/答案可能会起作用http://stackoverflow.com/questions/33398211/how-do-i-get-a-media-projection-manager-without-disturbing-the -current-foregroun (2认同)