Repository: BruceWind/AndroidScreenShot_SysApi Branch: master Commit: df470b7e92db Files: 32 Total size: 34.6 KB Directory structure: gitextract_ryiq_r0s/ ├── .github/ │ └── workflows/ │ └── android.yml ├── .gitignore ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── androidyuan/ │ │ └── androidscreenshot_sysapi/ │ │ └── ApplicationTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── androidyuan/ │ │ │ └── androidscreenshot_sysapi/ │ │ │ └── ExampleActivity.java │ │ └── res/ │ │ ├── layout/ │ │ │ └── activity_main.xml │ │ ├── values/ │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── values-w820dp/ │ │ └── dimens.xml │ └── test/ │ └── java/ │ └── com/ │ └── androidyuan/ │ └── androidscreenshot_sysapi/ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── libshot/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── androidyuan/ │ │ └── lib/ │ │ └── ApplicationTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── androidyuan/ │ │ │ └── lib/ │ │ │ └── screenshot/ │ │ │ ├── ScreenShotActivity.java │ │ │ └── Shooter.java │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── androidyuan/ │ └── lib/ │ └── ExampleUnitTest.java └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/android.yml ================================================ # if gitlab action running occur a error such as 'No toolchains found in the NDK toolchains folder # for ABI with prefix: mips64el-linux-android', might you need to change 'distributionUrl' of gradle zip and 'classpath'. name: Build & Publish Debug APK on: push: branches: - master jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Make Gradle executable run: chmod +x ./gradlew - name: Build with Gradle run: ./gradlew build - name: Build Debug APK run: ./gradlew assembleDebug # - name: Releasing using Hub # uses: ShaunLWM/action-release-debugapk@master # this value is not any user,it is a pedestal, # env: # GITHUB_TOKEN: ${{ secrets.TOKEN }} # APP_FOLDER: app # RELEASE_TITLE: New Build ================================================ FILE: .gitignore ================================================ *.iml .gradle /local.properties /.idea/workspace.xml /.idea/libraries .DS_Store /build /captures ### Android template # Built application files *.apk *.ap_ # Files for the ART/Dalvik VM *.dex # Java class files *.class # Generated files bin/ gen/ out/ # Gradle files .gradle/ build/ # Local configuration file (sdk path, etc) local.properties # Proguard folder generated by Eclipse proguard/ # Log Files *.log # Android Studio Navigation editor temp files .navigation/ # Android Studio captures folder captures/ # Intellij *.iml .idea/workspace.xml .idea/ # Keystore files *.jks ================================================ FILE: README.md ================================================ # AndroidScreenShot_SysApi 这是一个例子,以非常优雅的方案实现屏幕截图。 实现原理为 利用android 5.0 之后的录屏API获取一帧画面,来实现截屏。 ## Special Features 1. 打破老旧的截屏方案,不能截状态栏的问题。 2. 截图其他app. ## Usage **使用Shotter** 请查阅代码 onClickReqPermission() **使用ScreenShotActivity** 请查阅代码 onClickShot(),该方法可以截图其他app ### 更多拓展: > 因为ScreenShotActivity是一个透明并隐藏的activity,玩法有很多: a. 截图桌面; b. 对其他app进行截图:你自己试着调整shotter的delay时间为3秒,然后start截图,再切换到其他app里,等toast截图成功。 ================================================ FILE: app/.gitignore ================================================ /build ================================================ FILE: app/build.gradle ================================================ apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion '25.0.0' defaultConfig { applicationId "com.androidyuan.androidscreenshot_sysapi" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" } lintOptions { abortOnError false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug{ minifyEnabled false } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':libshot') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.0.1' } ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /home/wei/文档/tools/android-sdk-linux/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} ================================================ FILE: app/src/androidTest/java/com/androidyuan/androidscreenshot_sysapi/ApplicationTest.java ================================================ package com.androidyuan.androidscreenshot_sysapi; import android.app.Application; import android.test.ApplicationTestCase; /** * Testing Fundamentals */ public class ApplicationTest extends ApplicationTestCase { public ApplicationTest() { super(Application.class); } } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/com/androidyuan/androidscreenshot_sysapi/ExampleActivity.java ================================================ package com.androidyuan.androidscreenshot_sysapi; import android.content.Intent; import android.media.projection.MediaProjectionManager; import android.os.Build; import android.os.Bundle; import android.os.SystemClock; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; import com.androidyuan.lib.screenshot.ScreenShotActivity; import com.androidyuan.lib.screenshot.Shooter; /** * This class is a demo to show you how to use Shooter. */ public class ExampleActivity extends AppCompatActivity { private static final int REQ_CODE_PER = 0x2304; private static final int REQ_CODE_ACT = 0x2305; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * This is an example for using Shooter. * This method will request permission and take screenshot on this Activity. */ public void onClickReqPermission(View view) { if (Build.VERSION.SDK_INT >= 21) { startActivityForResult(createScreenCaptureIntent(), REQ_CODE_PER); } } /** * using {@see ScreenShotActivity} to take screenshot on current Activity directly. * If you press home it will take screenshot on another app. * @param view */ public void onClickShot(View view) { startActivityForResult(ScreenShotActivity.createIntent(this, null,0), REQ_CODE_ACT); toast("Press home key,open another app.");//if you want to take screenshot on another app. } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private Intent createScreenCaptureIntent() { //Here using media_projection instead of Context.MEDIA_PROJECTION_SERVICE to make it successfully build on low api. return ((MediaProjectionManager) getSystemService("media_projection")).createScreenCaptureIntent(); } private String getSavedPath() { return getExternalFilesDir("screenshot").getAbsoluteFile() + "/" + SystemClock.currentThreadTimeMillis() + ".png"; } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_CODE_ACT: { if (resultCode == RESULT_OK && data != null) { toast("Screenshot saved at " + data.getData().toString()); } else{ toast("You got wrong."); } } break; case REQ_CODE_PER: { if (resultCode == RESULT_OK && data != null) { Shooter shooter = new Shooter(ExampleActivity.this, resultCode, data); shooter.startScreenShot(getSavedPath(), new Shooter.OnShotListener() { @Override public void onFinish(String path) { //here is done status. toast("Screenshot saved at " + path); } @Override public void onError() { toast("You got wrong."); } } ); } else if (resultCode == RESULT_CANCELED) { //user canceled. } else { } } } } private void toast(String str) { Toast.makeText(ExampleActivity.this, str, Toast.LENGTH_LONG).show(); } private void goBackground() { Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); } } ================================================ FILE: app/src/main/res/layout/activity_main.xml ================================================