首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android 5.0或sdk >21中截屏

如何在Android 5.0或sdk >21中截屏
EN

Stack Overflow用户
提问于 2016-04-13 16:33:52
回答 3查看 111关注 0票数 1

正如你所知道的,如果设备是根的,你可以用代码截屏

代码语言:javascript
复制
Process sh = Runtime.getRuntime().exec("su", null,null);
OutputStream  os = sh.getOutputStream();
os.write(("/system/bin/screencap -p " + "/sdcard/img.png").getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();

但对于SDK>21 (5.0或更高版本),它不支持此功能。所以,我想知道如何使用Android 5.0或更高版本的服务(另一个应用程序)截屏。

我看到了MediaProjectionManager,但它需要运行onActivityResult来接收结果,但在服务中,它不能激活。

EN

回答 3

Stack Overflow用户

发布于 2016-04-13 17:54:40

这将为您提供:在您的类文件中全局声明它-

私有文件imageFile;私有void takeScreenshot() {

代码语言:javascript
复制
    try {
        String mPath = Environment.getExternalStorageDirectory().toString() +"\\/pic";            View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);

        imageFile = new File(mPath);

        FileOutputStream outputStream = new FileOutputStream(imageFile);
        int quality = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
        outputStream.flush();
        outputStream.close();
    } catch (Throwable e) {
        e.printStackTrace();
    }
票数 0
EN

Stack Overflow用户

发布于 2016-04-13 18:34:22

首先在您的activity类中添加一个Activity对象,如下所示-

代码语言:javascript
复制
public class FirstScreenActivity extends AppCompatActivity {

public static Activity mActivity;
private File imageFile;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActivity=this;
}

@Override
protected void onResume() {
    super.onResume();}

然后在您的非活动类文件中使用静态mActivity,如下所示,在前面的答案中使用上面的代码:

代码语言:javascript
复制
View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView();
票数 0
EN

Stack Overflow用户

发布于 2016-04-14 19:52:01

以下是要在清单文件中指定的接收者-

代码语言:javascript
复制
<receiver android:name=".reciever.EventReceiver">
        <intent-filter >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <action android:name="android.intent.action.USER_PRESENT"/>
        </intent-filter>
    </receiver>

像这些动作一样,你也可以选择其他动作。注意:不要忘记为您将在receiver中使用的操作添加权限。这是receiver类,您将在其中编写代码(在本例中为截图)-

代码语言:javascript
复制
public class EventReceiver  extends BroadcastReceiver {
private File imageFile;
private Context mContext;

@Override
public void onReceive(final Context context, Intent intent) {
    mContext=context;
    takeScreenshot();
//you can execute some of your other code also

}
private void takeScreenshot() {
    try {
        String mPath = Environment.getExternalStorageDirectory().toString() +"\\/pic";
        View v1 = FirstScreenActivity.mActivity.getWindow().getDecorView().getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);

        imageFile = new File(mPath);

        FileOutputStream outputStream = new FileOutputStream(imageFile);
        int quality = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
        outputStream.flush();
        outputStream.close();
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

}

使用它,您的接收器类的onReceive()将在您在清单中指定的特定事件操作上执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36592824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档