Android MediaProjection录屏权限处理

MediaProjection服务在SystemServiceRegistry的静态块里面注册的

java 复制代码
@frameworks/base/core/java/android/app/SystemServiceRegistry.java
public final class SystemServiceRegistry {
    private static final String TAG = "SystemServiceRegistry";

    /** @hide */
    public static boolean sEnableServiceNotFoundWtf = false;

    private static int sServiceCacheSize;

    private static volatile boolean sInitializing;

    // Not instantiable.
    private SystemServiceRegistry() { }

    static {
        registerService(Context.MEDIA_PROJECTION_SERVICE, MediaProjectionManager.class,

申请屏幕录制权限通过启动com.android.systemui/.media.MediaProjectionPermissionActivity来获取权限

java 复制代码
requestScreenRecordPermission
    Intent captureIntent = u3dClient.createScreenCaptureIntent();
        this.mProjectionManager.createScreenCaptureIntent();  
        //Intent { cmp=com.android.systemui/.media.MediaProjectionPermissionActivity } packagename=com.android.systemui
    startActivityForResult(captureIntent, LOCAL_REQUEST_CODE);
java 复制代码
@@frameworks/base/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java


/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.media;

import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.Typeface;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionManager;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.BidiFormatter;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.StyleSpan;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import com.android.systemui.R;
import com.android.systemui.util.Utils;

public class MediaProjectionPermissionActivity extends Activity
        implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
    private static final String TAG = "MediaProjectionPermissionActivity";
    private static final float MAX_APP_NAME_SIZE_PX = 500f;
    private static final String ELLIPSIS = "\u2026";

    private String mPackageName;
    private int mUid;
    private IMediaProjectionManager mService;

    private AlertDialog mDialog;

    @Override
    public void onCreate(Bundle icicle) {

	        Log.e(TAG, "xww getprojectionperimssino 1");
        super.onCreate(icicle);

        mPackageName = getCallingPackage();
        IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE);
        mService = IMediaProjectionManager.Stub.asInterface(b);

        if (mPackageName == null) {
            finish();
	        Log.e(TAG, "xww getprojectionperimssino 2");
            return;
        }

        PackageManager packageManager = getPackageManager();
        ApplicationInfo aInfo;
        try {
            aInfo = packageManager.getApplicationInfo(mPackageName, 0);
            mUid = aInfo.uid;
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "unable to look up package name", e);
            finish();
	        Log.e(TAG, "xww getprojectionperimssino 3");
            return;
        }

        try {
            if (mService.hasProjectionPermission(mUid, mPackageName)) {
                setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));
                finish();
	            Log.e(TAG, "xww getprojectionperimssino 4");
                return;
            } else {
                setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));
	            Log.e(TAG, "xww getprojectionperimssino 5");
                finish();
                return;
            }
        } catch (RemoteException e) {
            Log.e(TAG, "Error checking projection permissions", e);
            finish();
	        Log.e(TAG, "xww getprojectionperimssino 6");
            return;
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mDialog != null) {
            mDialog.dismiss();
        }
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        try {
            if (which == AlertDialog.BUTTON_POSITIVE) {
                setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));
            }
        } catch (RemoteException e) {
            Log.e(TAG, "Error granting projection permission", e);
            setResult(RESULT_CANCELED);
        } finally {
            if (mDialog != null) {
                mDialog.dismiss();
            }
            finish();
        }
    }

    private Intent getMediaProjectionIntent(int uid, String packageName)
            throws RemoteException {
        IMediaProjection projection = mService.createProjection(uid, packageName,
                 MediaProjectionManager.TYPE_SCREEN_CAPTURE, false /* permanentGrant */);
        Intent intent = new Intent();
        intent.putExtra(MediaProjectionManager.EXTRA_MEDIA_PROJECTION, projection.asBinder());
        return intent;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        finish();
    }
}

最后通过获取Activity的结果判断是否成功获取到屏幕录制权限

java 复制代码
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != Activity.RESULT_CANCELED) {
            Log.e(TAG, "获取到屏幕录制权限----");
            return;
        }
    }

@@frameworks/base/packages/SystemUI/src/com/android/systemui/media/MediaProjectionPermissionActivity.java

/*

* Copyright (C) 2014 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package com.android.systemui.media;

import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.pm.ApplicationInfo;

import android.content.pm.PackageManager;

import android.graphics.Typeface;

import android.media.projection.IMediaProjection;

import android.media.projection.IMediaProjectionManager;

import android.media.projection.MediaProjectionManager;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.os.ServiceManager;

import android.text.BidiFormatter;

import android.text.SpannableString;

import android.text.TextPaint;

import android.text.TextUtils;

import android.text.style.StyleSpan;

import android.util.Log;

import android.view.View;

import android.view.Window;

import android.view.WindowManager;

import android.widget.TextView;

import com.android.systemui.R;

import com.android.systemui.util.Utils;

public class MediaProjectionPermissionActivity extends Activity

implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener {

private static final String TAG = "MediaProjectionPermissionActivity";

private static final float MAX_APP_NAME_SIZE_PX = 500f;

private static final String ELLIPSIS = "\u2026";

private String mPackageName;

private int mUid;

private IMediaProjectionManager mService;

private AlertDialog mDialog;

@Override

public void onCreate(Bundle icicle) {

Log.e(TAG, "xww getprojectionperimssino 1");

super.onCreate(icicle);

mPackageName = getCallingPackage();

IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE);

mService = IMediaProjectionManager.Stub.asInterface(b);

if (mPackageName == null) {

finish();

Log.e(TAG, "xww getprojectionperimssino 2");

return;

}

PackageManager packageManager = getPackageManager();

ApplicationInfo aInfo;

try {

aInfo = packageManager.getApplicationInfo(mPackageName, 0);

mUid = aInfo.uid;

} catch (PackageManager.NameNotFoundException e) {

Log.e(TAG, "unable to look up package name", e);

finish();

Log.e(TAG, "xww getprojectionperimssino 3");

return;

}

try {

if (mService.hasProjectionPermission(mUid, mPackageName)) {

setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));

finish();

Log.e(TAG, "xww getprojectionperimssino 4");

return;

} else {

setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));

Log.e(TAG, "xww getprojectionperimssino 5");

finish();

return;

}

} catch (RemoteException e) {

Log.e(TAG, "Error checking projection permissions", e);

finish();

Log.e(TAG, "xww getprojectionperimssino 6");

return;

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if (mDialog != null) {

mDialog.dismiss();

}

}

@Override

public void onClick(DialogInterface dialog, int which) {

try {

if (which == AlertDialog.BUTTON_POSITIVE) {

setResult(RESULT_OK, getMediaProjectionIntent(mUid, mPackageName));

}

} catch (RemoteException e) {

Log.e(TAG, "Error granting projection permission", e);

setResult(RESULT_CANCELED);

} finally {

if (mDialog != null) {

mDialog.dismiss();

}

finish();

}

}

private Intent getMediaProjectionIntent(int uid, String packageName)

throws RemoteException {

IMediaProjection projection = mService.createProjection(uid, packageName,

MediaProjectionManager.TYPE_SCREEN_CAPTURE, false /* permanentGrant */);

Intent intent = new Intent();

intent.putExtra(MediaProjectionManager.EXTRA_MEDIA_PROJECTION, projection.asBinder());

return intent;

}

@Override

public void onCancel(DialogInterface dialog) {

finish();

}

}

相关推荐
服装学院的IT男31 分钟前
【Android 13源码分析】WindowContainer窗口层级-3-实例分析
android·数据库
Python私教2 小时前
JavaScript 基于生成器的异步编程方案相关代码分享
android·javascript·okhttp
文 丰2 小时前
【Android Studio】app:compileDebugJavaWithJavac FAILED解决办法
android·ide·android studio
寰宇软件3 小时前
Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi
android
文 丰3 小时前
【Android Studio】2024.1.1最新版本AS调试老项目(老版AS项目文件、旧gradle)导入其他人的项目
android·ide·android studio
Yongqiang Cheng4 小时前
在线查看 Android 系统源代码 Android Code Search
android·在线查看·android 系统源代码·code search
CYRUS STUDIO4 小时前
LineageOS源码下载和编译(Xiaomi Mi 6X,wayne)
android·刷机·lineageos·android源码编译
竹等寒5 小时前
中间件常见漏洞
android·web安全·网络安全·中间件
zeruns8027 小时前
如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程
android·java·智能手机·minecraft·mc
我命由我123458 小时前
ADB 之 logcat 极简小抄(过滤日志、保存日志到文件)
android·运维·adb·android studio·安卓·运维开发·android-studio