最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android實(shí)現(xiàn)錄屏功能

 更新時(shí)間:2020年02月05日 08:50:33   作者:jian11058  
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)錄屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了android實(shí)現(xiàn)錄屏功能的具體代碼,供大家參考,具體內(nèi)容如下

1、mian.activity

package com.fpt.screenvideo;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.projection.MediaProjectionManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

 private static final String TAG = "MainActivity";

 private Button mTextView,off_btn;

 private static final String RECORD_STATUS = "record_status";
 private static final int REQUEST_CODE = 1000;

 private int mScreenWidth;
 private int mScreenHeight;
 private int mScreenDensity;

 /** 是否已經(jīng)開啟視頻錄制 */
 private boolean isStarted = false;
 /** 是否為標(biāo)清視頻 */
 private boolean isVideoSd = true;
 /** 是否開啟音頻錄制 */
 private boolean isAudio = true;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Log.i(TAG, "onCreate");
  if(savedInstanceState != null) {
   isStarted = savedInstanceState.getBoolean(RECORD_STATUS);
  }
  getView() ;
  getScreenBaseInfo();
 }
 private void getView() {
  mTextView = findViewById(R.id.button_control);
  off_btn=findViewById(R.id.button_contro2);
  off_btn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
////    Intent service = new Intent(this, ScreenRecordService.class);
//    stopService(service);
//    isStarted = !isStarted;
   }
  });
  if(isStarted) {
   statusIsStarted();
  } else {
   statusIsStoped();
  }
  mTextView.setOnClickListener(new View.OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    if(isStarted) {

     stopScreenRecording();//功能
     statusIsStoped();//僅僅是狀態(tài)
     Log.i(TAG, "Stoped screen recording");
    } else {
     startScreenRecording();//功能
    }
   }
  });

  RadioGroup radioGroup = (RadioGroup) findViewById(R.id.redio_group);
  radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(RadioGroup group, int checkedId) {
    // TODO Auto-generated method stub
    switch (checkedId) {
     case R.id.sd_button:
      isVideoSd = true;
      break;
     case R.id.hd_button:
      isVideoSd = false;
      break;

     default:
      break;
    }
   }
  });

  CheckBox audioBox = (CheckBox) findViewById(R.id.audio_check_box);
  audioBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

   @Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    // TODO Auto-generated method stub
    isAudio = isChecked;
   }
  });
 }

 /**
  * 開啟屏幕錄制時(shí)的UI狀態(tài)
  */
 private void statusIsStarted() {
  mTextView.setText("停止錄制");
  mTextView.setBackgroundColor(Color.GREEN);
 }

 /**
  * 結(jié)束屏幕錄制后的UI狀態(tài)
  */
 private void statusIsStoped() {
  mTextView.setText("開始錄制");
  mTextView.setBackgroundColor(Color.RED);
 }

 /**
  * 獲取屏幕相關(guān)數(shù)據(jù)
  */
 private void getScreenBaseInfo() {
  DisplayMetrics metrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(metrics);
  mScreenWidth = metrics.widthPixels;
  mScreenHeight = metrics.heightPixels;
  mScreenDensity = metrics.densityDpi;
 }

 @Override
 protected void onSaveInstanceState(Bundle outState) {
  // TODO Auto-generated method stub
  super.onSaveInstanceState(outState);
  outState.putBoolean(RECORD_STATUS, isStarted);
 }

 /**
  * 獲取屏幕錄制的權(quán)限
  */
 private void startScreenRecording() {
  // TODO Auto-generated method stub
  MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
  Intent permissionIntent = mediaProjectionManager.createScreenCaptureIntent();
  startActivityForResult(permissionIntent, REQUEST_CODE);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
  if(requestCode == REQUEST_CODE) {
   if(resultCode == RESULT_OK) {
    // 獲得權(quán)限,啟動(dòng)Service開始錄制
    Intent service = new Intent(this, ScreenRecordService.class);
    service.putExtra("code", resultCode);
    service.putExtra("data", data);
    service.putExtra("audio", isAudio);
    service.putExtra("width", mScreenWidth);
    service.putExtra("height", mScreenHeight);
    service.putExtra("density", mScreenDensity);
    service.putExtra("quality", isVideoSd);
    startService(service);
    // 已經(jīng)開始屏幕錄制,修改UI狀態(tài)
    isStarted = !isStarted;
    statusIsStarted();
//    simulateHome(); // this.finish(); // 可以直接關(guān)閉Activity
    Log.i(TAG, "Started screen recording");
   } else {
    Toast.makeText(this, "跳出提示框", Toast.LENGTH_LONG).show();
    Log.i(TAG, "User cancelled");
   }
  }
 }

 /**
  * 關(guān)閉屏幕錄制,即停止錄制Service
  */
 private void stopScreenRecording() {
  // TODO Auto-generated method stub
  Intent service = new Intent(this, ScreenRecordService.class);
  stopService(service);
  isStarted = !isStarted;
 }

 /**
  * 模擬HOME鍵返回桌面的功能
  */
 private void simulateHome() {
  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  intent.addCategory(Intent.CATEGORY_HOME);
  this.startActivity(intent);
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  // 在這里將BACK鍵模擬了HOME鍵的返回桌面功能(并無必要)
  if(keyCode == KeyEvent.KEYCODE_BACK) {
   simulateHome();
   return true;
  }
  return super.onKeyDown(keyCode, event);
 }

}

2、ScreenRecordService

package com.fpt.screenvideo;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ScreenRecordService extends Service {
 private static final String TAG = "ScreenRecordingService";

 private int mScreenWidth;
 private int mScreenHeight;
 private int mScreenDensity;
 private int mResultCode;
 private Intent mResultData;
 /** 是否為標(biāo)清視頻 */
 private boolean isVideoSd;
 /** 是否開啟音頻錄制 */
 private boolean isAudio;

 private MediaProjection mMediaProjection;
 private MediaRecorder mMediaRecorder;
 private VirtualDisplay mVirtualDisplay;

 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
  Log.i(TAG, "Service onCreate() is called");
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  // TODO Auto-generated method stub
  Log.i(TAG, "Service onStartCommand() is called");

  mResultCode = intent.getIntExtra("code", -1);
  mResultData = intent.getParcelableExtra("data");
  mScreenWidth = intent.getIntExtra("width", 720);
  mScreenHeight = intent.getIntExtra("height", 1280);
  mScreenDensity = intent.getIntExtra("density", 1);
  isVideoSd = intent.getBooleanExtra("quality", true);
  isAudio = intent.getBooleanExtra("audio", true);

  mMediaProjection = createMediaProjection();
  mMediaRecorder = createMediaRecorder();
  mVirtualDisplay = createVirtualDisplay(); // 必須在mediaRecorder.prepare() 之后調(diào)用,否則報(bào)錯(cuò)"fail to get surface"
  mMediaRecorder.start();

  return Service.START_NOT_STICKY;
 }

 private MediaProjection createMediaProjection() {
  Log.i(TAG, "Create MediaProjection");
  return ((MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE)).getMediaProjection(mResultCode, mResultData);
 }

 private MediaRecorder createMediaRecorder() {
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
  Date curDate = new Date(System.currentTimeMillis());
  String curTime = formatter.format(curDate).replace(" ", "");
  String videoQuality = "HD";
  if(isVideoSd) videoQuality = "SD";

  Log.i(TAG, "Create MediaRecorder");
  MediaRecorder mediaRecorder = new MediaRecorder();
//  if(isAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
  mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  mediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/" + videoQuality + curTime + ".mp4");
  mediaRecorder.setVideoSize(mScreenWidth, mScreenHeight); //after setVideoSource(), setOutFormat()
  mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //after setOutputFormat()
//  if(isAudio) mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); //after setOutputFormat()
  int bitRate;
  if(isVideoSd) {
   mediaRecorder.setVideoEncodingBitRate(mScreenWidth * mScreenHeight);
   mediaRecorder.setVideoFrameRate(30);
   bitRate = mScreenWidth * mScreenHeight / 1000;
  } else {
   mediaRecorder.setVideoEncodingBitRate(5 * mScreenWidth * mScreenHeight);
   mediaRecorder.setVideoFrameRate(60); //after setVideoSource(), setOutFormat()
   bitRate = 5 * mScreenWidth * mScreenHeight / 1000;
  }
  try {
   mediaRecorder.prepare();
  } catch (IllegalStateException | IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  Log.i(TAG, "Audio: " + isAudio + ", SD video: " + isVideoSd + ", BitRate: " + bitRate + "kbps");

  return mediaRecorder;
 }

 private VirtualDisplay createVirtualDisplay() {
  Log.i(TAG, "Create VirtualDisplay");
  return mMediaProjection.createVirtualDisplay(TAG, mScreenWidth, mScreenHeight, mScreenDensity,
    DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null, null);
 }

 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  Log.i(TAG, "Service onDestroy");
  if(mVirtualDisplay != null) {
   mVirtualDisplay.release();
   mVirtualDisplay = null;
  }
  if(mMediaRecorder != null) {
   mMediaRecorder.setOnErrorListener(null);
   mMediaProjection.stop();
   mMediaRecorder.reset();
  }
  if(mMediaProjection != null) {
   mMediaProjection.stop();
   mMediaProjection = null;
  }
 }

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
}

3、androidManifest.xml權(quán)限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

4、service的注冊(cè)

<service android:name=".ScreenRecordService"/>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 中ListView setOnItemClickListener點(diǎn)擊無效原因分析

    Android 中ListView setOnItemClickListener點(diǎn)擊無效原因分析

    這篇文章主要介紹了Android 中ListView setOnItemClickListener點(diǎn)擊無效原因分析的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Flutter 如何設(shè)置App的主色調(diào)與字體

    Flutter 如何設(shè)置App的主色調(diào)與字體

    App 開發(fā)過程中,肯定希望給用戶帶來一致的體驗(yàn),這其中最基礎(chǔ)的就是色調(diào)、字體保持一致。在 Flutter 中,可以設(shè)置全局的主題色調(diào)和字體,從而在其他頁面引用主色調(diào)和字體,實(shí)現(xiàn)頁面展示層面的一致。
    2021-05-05
  • Android binder 匿名服務(wù)實(shí)現(xiàn)雙向通信的解決方案

    Android binder 匿名服務(wù)實(shí)現(xiàn)雙向通信的解決方案

    這篇文章主要介紹了Android binder 匿名服務(wù)實(shí)現(xiàn)雙向通信的解決方案,當(dāng)然,這種方案是可行的,只是需要client和server都向servicemanager注冊(cè)一個(gè)服務(wù),實(shí)現(xiàn)起來有點(diǎn)麻煩,不太建議這么做,需要的朋友可以參考下
    2024-04-04
  • Android中快速便捷的實(shí)現(xiàn)圓角按鈕方法詳解

    Android中快速便捷的實(shí)現(xiàn)圓角按鈕方法詳解

    圓角按鈕在我們現(xiàn)在的界面中常常會(huì)用到,最近在開發(fā)中就又遇到了,所以想著有沒有更快速更便捷的實(shí)現(xiàn)方法呢,所以就有了這篇文章,本文主要給大家介紹了關(guān)于Android中如何快速便捷的實(shí)現(xiàn)圓角按鈕的相關(guān)資料,需要的朋友可以參考下。
    2017-05-05
  • Android5.0中多種水波紋效果的實(shí)現(xiàn)代碼

    Android5.0中多種水波紋效果的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android5.0中多種水波紋效果的實(shí)現(xiàn)代碼,水波紋效果大致上可以分為兩種,一種是有界的,一種無界,一起跟隨小編過來看看吧
    2018-05-05
  • Android自定義轉(zhuǎn)盤菜單效果

    Android自定義轉(zhuǎn)盤菜單效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義轉(zhuǎn)盤菜單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android編程之SQLite數(shù)據(jù)庫操作方法詳解

    Android編程之SQLite數(shù)據(jù)庫操作方法詳解

    這篇文章主要介紹了Android編程之SQLite數(shù)據(jù)庫操作方法,簡(jiǎn)單介紹了SQLite數(shù)據(jù)庫及Android操作SQLite數(shù)據(jù)庫的步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • Android中沒有插入SD情況下的文件寫入和讀取方法

    Android中沒有插入SD情況下的文件寫入和讀取方法

    在Android開發(fā)時(shí)會(huì)遇到如下一種場(chǎng)合希望應(yīng)用下載到當(dāng)前應(yīng)用的根目錄下,而非SD卡中然后可以隨時(shí)被該應(yīng)用或其他應(yīng)用訪問這個(gè)文件,即具有被全局讀取的權(quán)限
    2012-11-11
  • Android Activity的生命周期與啟動(dòng)模式全面解讀

    Android Activity的生命周期與啟動(dòng)模式全面解讀

    雖然說我們天天都在使用Activity,但是你真的對(duì)Activity的生命機(jī)制完全了解了嗎?Activity的生命周期方法只有七個(gè),但是其實(shí)那只是默認(rèn)的情況。也就是說在其他情況下,Activity的生命周期可能不會(huì)是按照我們以前所知道的流程,這就要說到Activity的啟動(dòng)模式
    2021-10-10
  • android里面屏蔽home鍵/禁止Home鍵或者隨你DIY

    android里面屏蔽home鍵/禁止Home鍵或者隨你DIY

    可以先禁止Home鍵,再在onKeyDown里處理按鍵值,點(diǎn)然后在擊Home鍵的時(shí)候就把程序關(guān)閉,或者隨你DIY等等,感覺你可以隨心所欲吧,再接再厲,希望本文可以幫助到你
    2013-01-01

最新評(píng)論

图片| 嘉义市| 临沭县| 蒲江县| 德令哈市| 河西区| 迁安市| 台安县| 上栗县| 犍为县| 什邡市| 松阳县| 青阳县| 佛坪县| 长乐市| 泸水县| 乌恰县| 辰溪县| 宜昌市| 育儿| 嘉善县| 习水县| 光泽县| 金寨县| 张家界市| 勐海县| 蓬安县| 肥城市| 清河县| 牡丹江市| 石首市| 沈丘县| 佳木斯市| 关岭| 马关县| 霞浦县| 石景山区| 施甸县| 密云县| 微博| 定西市|