diff --git a/README.md b/README.md index c0ff920c..325acf8b 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ `android.permission.BIND_NOTIFICATION_LISTENER_SERVICE` 7. Request to modify system setting. `android.permission.WRITE_SETTINGS` +8. Request to capture screen. ```java AndPermission.with(this) diff --git a/permission/src/main/aidl/com/yanzhenjie/permission/bridge/IBridge.aidl b/permission/src/main/aidl/com/yanzhenjie/permission/bridge/IBridge.aidl index 4635d8ef..7b2bb146 100644 --- a/permission/src/main/aidl/com/yanzhenjie/permission/bridge/IBridge.aidl +++ b/permission/src/main/aidl/com/yanzhenjie/permission/bridge/IBridge.aidl @@ -40,4 +40,9 @@ interface IBridge { * Request for write system setting. */ void requestWriteSetting(in String suffix); + + /** + * Request for media capture. + */ + void requestMediaCapture(in String suffix); } \ No newline at end of file diff --git a/permission/src/main/java/com/yanzhenjie/permission/Boot.java b/permission/src/main/java/com/yanzhenjie/permission/Boot.java index 1ae38b53..3d51ac42 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/Boot.java +++ b/permission/src/main/java/com/yanzhenjie/permission/Boot.java @@ -20,6 +20,7 @@ import com.yanzhenjie.permission.install.InstallRequest; import com.yanzhenjie.permission.install.NRequestFactory; import com.yanzhenjie.permission.install.ORequestFactory; +import com.yanzhenjie.permission.media.Media; import com.yanzhenjie.permission.notify.Notify; import com.yanzhenjie.permission.notify.option.NotifyOption; import com.yanzhenjie.permission.option.Option; @@ -99,4 +100,9 @@ public NotifyOption notification() { public Setting setting() { return new Setting(mSource); } + + @Override + public Media media() { + return new Media(mSource); + } } \ No newline at end of file diff --git a/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeActivity.java b/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeActivity.java index 5f3ccb36..532d42bc 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeActivity.java +++ b/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeActivity.java @@ -16,7 +16,9 @@ package com.yanzhenjie.permission.bridge; import android.app.Activity; +import android.content.Context; import android.content.Intent; +import android.media.projection.MediaProjectionManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; @@ -123,6 +125,16 @@ static void requestWriteSetting(Source source, String suffix) { source.startActivity(intent); } + /** + * Request for media capture. + */ + static void requestMediaCapture(Source source, String suffix) { + Intent intent = new Intent(source.getContext(), BridgeActivity.class); + intent.putExtra(KEY_TYPE, BridgeRequest.TYPE_MEDIA_CAPTURE); + intent.putExtra(KEY_ACTION_SUFFIX, suffix); + source.startActivity(intent); + } + private String mActionSuffix; @Override @@ -180,6 +192,13 @@ protected void onCreate(Bundle savedInstanceState) { startActivityForResult(settingIntent, BridgeRequest.TYPE_WRITE_SETTING); break; } + case BridgeRequest.TYPE_MEDIA_CAPTURE: { + MediaProjectionManager mpm = (MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE); + Intent captureIntent = mpm.createScreenCaptureIntent(); + captureIntent.setData(Uri.fromParts("package", getPackageName(), null)); + startActivityForResult(captureIntent, BridgeRequest.TYPE_MEDIA_CAPTURE); + break; + } } } @@ -197,7 +216,11 @@ public void startActivityForResult(Intent intent, int requestCode) { @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); - Messenger.send(this, mActionSuffix); + if (requestCode == BridgeRequest.TYPE_MEDIA_CAPTURE && resultCode == RESULT_OK) { + Messenger.send(this, mActionSuffix, data); + } else { + Messenger.send(this, mActionSuffix); + } finish(); } diff --git a/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeRequest.java b/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeRequest.java index 2ff27298..e601517b 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeRequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeRequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.bridge; +import android.content.Intent; + import com.yanzhenjie.permission.source.Source; import java.util.List; @@ -32,6 +34,7 @@ public final class BridgeRequest { public static final int TYPE_NOTIFY = 6; public static final int TYPE_NOTIFY_LISTENER = 7; public static final int TYPE_WRITE_SETTING = 8; + public static final int TYPE_MEDIA_CAPTURE = 9; private final Source mSource; @@ -73,6 +76,6 @@ public void setPermissions(List permissions) { public interface Callback { - void onCallback(); + void onCallback(Intent intent); } } \ No newline at end of file diff --git a/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeService.java b/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeService.java index 0000b3c8..b2bca641 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeService.java +++ b/permission/src/main/java/com/yanzhenjie/permission/bridge/BridgeService.java @@ -79,5 +79,10 @@ public void requestNotificationListener(String suffix) throws RemoteException { public void requestWriteSetting(String suffix) throws RemoteException { BridgeActivity.requestWriteSetting(mSource, suffix); } + + @Override + public void requestMediaCapture(String suffix) throws RemoteException { + BridgeActivity.requestMediaCapture(mSource, suffix); + } }; } \ No newline at end of file diff --git a/permission/src/main/java/com/yanzhenjie/permission/bridge/Messenger.java b/permission/src/main/java/com/yanzhenjie/permission/bridge/Messenger.java index 1ac5b805..269ac43a 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/bridge/Messenger.java +++ b/permission/src/main/java/com/yanzhenjie/permission/bridge/Messenger.java @@ -32,6 +32,12 @@ public static void send(Context context, String suffix) { context.sendBroadcast(broadcast); } + public static void send(Context context, String suffix, Intent extraIntent) { + Intent broadcast = new Intent(AndPermission.bridgeAction(context, suffix)); + broadcast.putExtra(Intent.EXTRA_INTENT, extraIntent); + context.sendBroadcast(broadcast); + } + private final Context mContext; private final Callback mCallback; @@ -51,11 +57,12 @@ public void unRegister() { @Override public void onReceive(Context context, Intent intent) { - mCallback.onCallback(); + Intent extraIntent = intent.getParcelableExtra(Intent.EXTRA_INTENT); + mCallback.onCallback(extraIntent); } public interface Callback { - void onCallback(); + void onCallback(Intent intent); } } \ No newline at end of file diff --git a/permission/src/main/java/com/yanzhenjie/permission/bridge/RequestExecutor.java b/permission/src/main/java/com/yanzhenjie/permission/bridge/RequestExecutor.java index 5cc1609f..edf1723f 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/bridge/RequestExecutor.java +++ b/permission/src/main/java/com/yanzhenjie/permission/bridge/RequestExecutor.java @@ -104,15 +104,19 @@ private void executeCurrent(IBridge iBridge) throws RemoteException { iBridge.requestWriteSetting(getName()); break; } + case BridgeRequest.TYPE_MEDIA_CAPTURE: { + iBridge.requestMediaCapture(getName()); + break; + } } } @Override - public void onCallback() { + public void onCallback(Intent intent) { synchronized (this) { mMessenger.unRegister(); - mRequest.getCallback().onCallback(); + mRequest.getCallback().onCallback(intent); mRequest.getSource().getContext().unbindService(mConnection); mMessenger = null; mRequest = null; diff --git a/permission/src/main/java/com/yanzhenjie/permission/install/ORequest.java b/permission/src/main/java/com/yanzhenjie/permission/install/ORequest.java index 9d7243df..39af297a 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/install/ORequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/install/ORequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.install; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -56,7 +58,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (mSource.canRequestPackageInstalls()) { callbackSucceed(); install(); diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/Media.java b/permission/src/main/java/com/yanzhenjie/permission/media/Media.java new file mode 100644 index 00000000..7b8b6fd3 --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/Media.java @@ -0,0 +1,42 @@ +package com.yanzhenjie.permission.media; + +import android.os.Build; + +import com.yanzhenjie.permission.media.capture.LCaptureRequestFactory; +import com.yanzhenjie.permission.media.capture.KCaptureRequestFactory; +import com.yanzhenjie.permission.media.capture.CaptureRequest; +import com.yanzhenjie.permission.source.Source; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public class Media { + + private static final MediaRequestFactory MEDIA_CAPTURE_REQUEST_FACTORY; + + static { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + MEDIA_CAPTURE_REQUEST_FACTORY = new LCaptureRequestFactory(); + } else { + MEDIA_CAPTURE_REQUEST_FACTORY = new KCaptureRequestFactory(); + } + } + + public interface MediaRequestFactory { + + CaptureRequest create(Source source); + } + + private Source mSource; + + public Media(Source source) { + this.mSource = source; + } + + /** + * Permission media capture. + */ + public CaptureRequest capture() { + return MEDIA_CAPTURE_REQUEST_FACTORY.create(mSource); + } +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/capture/BaseRequest.java b/permission/src/main/java/com/yanzhenjie/permission/media/capture/BaseRequest.java new file mode 100644 index 00000000..1c2b0978 --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/capture/BaseRequest.java @@ -0,0 +1,53 @@ +package com.yanzhenjie.permission.media.capture; + +import android.content.Intent; + +import androidx.annotation.NonNull; + +import com.yanzhenjie.permission.Action; +import com.yanzhenjie.permission.source.Source; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +abstract class BaseRequest implements CaptureRequest { + + protected Source mSource; + + private Action mGranted; + private Action mDenied; + + public BaseRequest(Source source) { + this.mSource = source; + } + + @Override + public CaptureRequest onGranted(@NonNull Action granted) { + this.mGranted = granted; + return this; + } + + @Override + public CaptureRequest onDenied(@NonNull Action denied) { + this.mDenied = denied; + return this; + } + + /** + * Callback acceptance status. + */ + final void callbackSucceed(Intent intent) { + if (mGranted != null) { + mGranted.onAction(intent); + } + } + + /** + * Callback rejected state. + */ + final void callbackFailed() { + if (mDenied != null) { + mDenied.onAction(null); + } + } +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/capture/CaptureRequest.java b/permission/src/main/java/com/yanzhenjie/permission/media/capture/CaptureRequest.java new file mode 100644 index 00000000..19f1853b --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/capture/CaptureRequest.java @@ -0,0 +1,28 @@ +package com.yanzhenjie.permission.media.capture; + +import android.content.Intent; + +import androidx.annotation.NonNull; + +import com.yanzhenjie.permission.Action; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public interface CaptureRequest { + + /** + * Action to be taken when permission is granted. + */ + CaptureRequest onGranted(@NonNull Action granted); + + /** + * Action to be taken when permission is denied. + */ + CaptureRequest onDenied(@NonNull Action denied); + + /** + * Request permission. + */ + void start(); +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/capture/KCaptureRequest.java b/permission/src/main/java/com/yanzhenjie/permission/media/capture/KCaptureRequest.java new file mode 100644 index 00000000..3c509f15 --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/capture/KCaptureRequest.java @@ -0,0 +1,18 @@ +package com.yanzhenjie.permission.media.capture; + +import com.yanzhenjie.permission.source.Source; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public class KCaptureRequest extends BaseRequest { + + public KCaptureRequest(Source source) { + super(source); + } + + @Override + public void start() { + callbackFailed(); + } +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/capture/KCaptureRequestFactory.java b/permission/src/main/java/com/yanzhenjie/permission/media/capture/KCaptureRequestFactory.java new file mode 100644 index 00000000..17a899a6 --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/capture/KCaptureRequestFactory.java @@ -0,0 +1,15 @@ +package com.yanzhenjie.permission.media.capture; + +import com.yanzhenjie.permission.media.Media; +import com.yanzhenjie.permission.source.Source; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public class KCaptureRequestFactory implements Media.MediaRequestFactory { + + @Override + public CaptureRequest create(Source source) { + return new KCaptureRequest(source); + } +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/capture/LCaptureRequest.java b/permission/src/main/java/com/yanzhenjie/permission/media/capture/LCaptureRequest.java new file mode 100644 index 00000000..debb010f --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/capture/LCaptureRequest.java @@ -0,0 +1,45 @@ +package com.yanzhenjie.permission.media.capture; + +import android.content.Intent; + +import com.yanzhenjie.permission.RequestExecutor; +import com.yanzhenjie.permission.bridge.BridgeRequest; +import com.yanzhenjie.permission.bridge.RequestManager; +import com.yanzhenjie.permission.source.Source; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public class LCaptureRequest extends BaseRequest implements RequestExecutor, BridgeRequest.Callback { + + public LCaptureRequest(Source source) { + super(source); + } + + @Override + public void start() { + execute(); + } + + @Override + public void execute() { + BridgeRequest request = new BridgeRequest(mSource); + request.setType(BridgeRequest.TYPE_MEDIA_CAPTURE); + request.setCallback(this); + RequestManager.get().add(request); + } + + @Override + public void cancel() { + callbackFailed(); + } + + @Override + public void onCallback(Intent intent) { + if (intent != null) { + callbackSucceed(intent); + } else { + callbackFailed(); + } + } +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/media/capture/LCaptureRequestFactory.java b/permission/src/main/java/com/yanzhenjie/permission/media/capture/LCaptureRequestFactory.java new file mode 100644 index 00000000..1e3284eb --- /dev/null +++ b/permission/src/main/java/com/yanzhenjie/permission/media/capture/LCaptureRequestFactory.java @@ -0,0 +1,15 @@ +package com.yanzhenjie.permission.media.capture; + +import com.yanzhenjie.permission.media.Media; +import com.yanzhenjie.permission.source.Source; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public class LCaptureRequestFactory implements Media.MediaRequestFactory { + + @Override + public CaptureRequest create(Source source) { + return new LCaptureRequest(source); + } +} diff --git a/permission/src/main/java/com/yanzhenjie/permission/notify/NRequest.java b/permission/src/main/java/com/yanzhenjie/permission/notify/NRequest.java index 12d932ec..08398301 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/notify/NRequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/notify/NRequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.notify; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -55,7 +57,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (mSource.canNotify()) { callbackSucceed(); } else { diff --git a/permission/src/main/java/com/yanzhenjie/permission/notify/ORequest.java b/permission/src/main/java/com/yanzhenjie/permission/notify/ORequest.java index b74e2e7e..99113576 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/notify/ORequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/notify/ORequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.notify; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -55,7 +57,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (mSource.canNotify()) { callbackSucceed(); } else { diff --git a/permission/src/main/java/com/yanzhenjie/permission/notify/listener/J2Request.java b/permission/src/main/java/com/yanzhenjie/permission/notify/listener/J2Request.java index d0ff484a..d76796de 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/notify/listener/J2Request.java +++ b/permission/src/main/java/com/yanzhenjie/permission/notify/listener/J2Request.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.notify.listener; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -55,7 +57,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (mSource.canListenerNotification()) { callbackSucceed(); } else { diff --git a/permission/src/main/java/com/yanzhenjie/permission/option/Option.java b/permission/src/main/java/com/yanzhenjie/permission/option/Option.java index 919078a1..d51d9661 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/option/Option.java +++ b/permission/src/main/java/com/yanzhenjie/permission/option/Option.java @@ -19,6 +19,7 @@ import com.yanzhenjie.permission.notify.option.NotifyOption; import com.yanzhenjie.permission.overlay.OverlayRequest; import com.yanzhenjie.permission.runtime.option.RuntimeOption; +import com.yanzhenjie.permission.media.Media; import com.yanzhenjie.permission.setting.Setting; /** @@ -50,4 +51,9 @@ public interface Option { * Handle system setting. */ Setting setting(); + + /** + * Handle system setting. + */ + Media media(); } \ No newline at end of file diff --git a/permission/src/main/java/com/yanzhenjie/permission/overlay/LRequest.java b/permission/src/main/java/com/yanzhenjie/permission/overlay/LRequest.java index 4c7411e7..0f7d9fd0 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/overlay/LRequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/overlay/LRequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.overlay; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -55,7 +57,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (tryDisplayDialog(mSource.getContext())) { callbackSucceed(); } else { diff --git a/permission/src/main/java/com/yanzhenjie/permission/overlay/MRequest.java b/permission/src/main/java/com/yanzhenjie/permission/overlay/MRequest.java index 430b16f8..dc3804a6 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/overlay/MRequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/overlay/MRequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.overlay; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -35,7 +37,7 @@ class MRequest extends BaseRequest implements RequestExecutor, BridgeRequest.Cal @Override public void start() { if (mSource.canDrawOverlays()) { - onCallback(); + onCallback(null); } else { showRationale(this); } @@ -55,7 +57,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (mSource.canDrawOverlays() && tryDisplayDialog(mSource.getContext())) { callbackSucceed(); } else { diff --git a/permission/src/main/java/com/yanzhenjie/permission/runtime/MRequest.java b/permission/src/main/java/com/yanzhenjie/permission/runtime/MRequest.java index 5a1562e9..08e543cd 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/runtime/MRequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/runtime/MRequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.runtime; +import android.content.Intent; + import androidx.annotation.NonNull; import com.yanzhenjie.permission.RequestExecutor; @@ -78,7 +80,7 @@ public void start() { execute(); } } else { - onCallback(); + onCallback(null); } } @@ -93,11 +95,11 @@ public void execute() { @Override public void cancel() { - onCallback(); + onCallback(null); } @Override - public void onCallback() { + public void onCallback(Intent intent) { new TaskExecutor>(mSource.getContext()) { @Override protected List doInBackground(Void... voids) { diff --git a/permission/src/main/java/com/yanzhenjie/permission/setting/write/MWriteRequest.java b/permission/src/main/java/com/yanzhenjie/permission/setting/write/MWriteRequest.java index 6ce3b923..29b86b81 100644 --- a/permission/src/main/java/com/yanzhenjie/permission/setting/write/MWriteRequest.java +++ b/permission/src/main/java/com/yanzhenjie/permission/setting/write/MWriteRequest.java @@ -15,6 +15,8 @@ */ package com.yanzhenjie.permission.setting.write; +import android.content.Intent; + import com.yanzhenjie.permission.RequestExecutor; import com.yanzhenjie.permission.bridge.BridgeRequest; import com.yanzhenjie.permission.bridge.RequestManager; @@ -55,7 +57,7 @@ public void cancel() { } @Override - public void onCallback() { + public void onCallback(Intent intent) { if (mSource.canWriteSetting()) { callbackSucceed(); } else { diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index b4e9b5fe..b4ace10d 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -61,6 +61,8 @@ + + + + \ No newline at end of file diff --git a/sample/src/main/java/com/yanzhenjie/permission/sample/app/MainActivity.java b/sample/src/main/java/com/yanzhenjie/permission/sample/app/MainActivity.java index 3ae5642d..02c1e4c3 100644 --- a/sample/src/main/java/com/yanzhenjie/permission/sample/app/MainActivity.java +++ b/sample/src/main/java/com/yanzhenjie/permission/sample/app/MainActivity.java @@ -15,6 +15,7 @@ */ package com.yanzhenjie.permission.sample.app; +import android.app.ActivityManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -91,6 +92,7 @@ protected void onCreate(Bundle savedInstanceState) { findViewById(R.id.btn_install).setOnClickListener(this); findViewById(R.id.btn_overlay).setOnClickListener(this); findViewById(R.id.btn_write_setting).setOnClickListener(this); + findViewById(R.id.btn_screen_capture).setOnClickListener(this); } @Override @@ -356,6 +358,10 @@ public boolean onMenuItemClick(MenuItem item) { requestWriteSystemSetting(); break; } + case R.id.btn_screen_capture: { + requestPermissionForScreenCapture(); + break; + } } } @@ -603,6 +609,39 @@ public void onAction(Void data) { }).start(); } + private void requestPermissionForScreenCapture() { + stopScreenCaptureService(); + + AndPermission.with(this).media().capture().onGranted(new Action() { + @Override + public void onAction(Intent data) { + toast(R.string.successfully); + + Context context = getApplicationContext(); + Intent service = new Intent(context, ScreenCaptureService.class); + context.startService(service); + } + }).onDenied(new Action() { + @Override + public void onAction(Void data) { + toast(R.string.failure); + } + }).start(); + } + + private void stopScreenCaptureService() { + ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + if (manager != null) { + for (ActivityManager.RunningServiceInfo serviceInfo : manager.getRunningServices(Integer.MAX_VALUE)) { + if (ScreenCaptureService.class.getName().equals(serviceInfo.service.getClassName())) { + Context context = getApplicationContext(); + Intent service = new Intent(context, ScreenCaptureService.class); + context.stopService(service); + } + } + } + } + private void showAlertWindow() { App.get().showLauncherView(); diff --git a/sample/src/main/java/com/yanzhenjie/permission/sample/app/ScreenCaptureService.java b/sample/src/main/java/com/yanzhenjie/permission/sample/app/ScreenCaptureService.java new file mode 100644 index 00000000..02b7adfd --- /dev/null +++ b/sample/src/main/java/com/yanzhenjie/permission/sample/app/ScreenCaptureService.java @@ -0,0 +1,57 @@ +package com.yanzhenjie.permission.sample.app; + +import static android.app.Activity.RESULT_OK; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +/** + * Created by Khanh Bui on 2022/2/22. + */ +public class ScreenCaptureService extends Service { + + private static final String TAG = ScreenCaptureService.class.getSimpleName(); + + private MediaProjection mMediaProjection; + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + MediaProjectionManager pm = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE); + mMediaProjection = pm.getMediaProjection(RESULT_OK, intent); + + if (mMediaProjection != null) { + Log.e(TAG, "Cannot retrieve MediaProjection."); + } else { + Log.e(TAG, "MediaProjection started."); + } + + return START_STICKY; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + public void onDestroy() { + if (mMediaProjection != null) { + mMediaProjection.stop(); + mMediaProjection = null; + } + + super.onDestroy(); + } +} diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index a079a926..dbb89044 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -150,6 +150,14 @@ style="@style/Permission.Button.Weight.Horizontal" android:text="@string/permission_write_setting" /> + + + +