MediaRecorder手机录屏,部分手机失败报错

mdqwuyan 2019-02-25 07:24:28
02-25 03:50:35.021 3694 3694 D StatusBar: disable<e i a s b h r c s > disable2<q i n >
02-25 03:50:35.161 3694 3694 E ScreenRecordTile: uid=10053
02-25 03:50:35.166 3694 3694 E ScreenRecordTile: projection=android.media.projection.IMediaProjection$Stub$Proxy@a2056b6
02-25 03:50:35.195 2672 5519 I OMXClient: IOmx service obtained
02-25 03:50:35.196 2702 2702 I OMXMaster: makeComponentInstance(OMX.qcom.video.encoder.avc) in omx@1.0-service process
02-25 03:50:35.206 568 588 E ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
02-25 03:50:35.206 2702 2702 I OMX-VENC: Video encode perflock acquired,handle=51
02-25 03:50:35.401 2702 2702 I OMX-VENC: Component_init : OMX.qcom.video.encoder.avc : return = 0x0
02-25 03:50:35.411 2672 5518 I MediaCodec: MediaCodec will operate in async mode
02-25 03:50:35.416 2702 2702 E OMXNodeInstance: setParameter(0xebfc9b04:qcom.encoder.avc, OMX.google.android.index.allocateNativeHandle(0x7f00005d): Output:1 en=0) ERROR: UnsupportedSetting(0x80001019)
02-25 03:50:35.416 2702 2702 W OMXNodeInstance: [0xebfc9b04:qcom.encoder.avc] component does not support metadata mode; using fallback
02-25 03:50:35.416 2672 5519 I ExtendedACodec: setupVideoEncoder()
02-25 03:50:35.418 2672 5519 W OMXUtils: do not know color format 0x7fa30c04 = 2141391876
02-25 03:50:35.420 2672 5519 W OMXUtils: do not know color format 0x7f000789 = 2130708361
02-25 03:50:35.431 2702 5521 E OMX-VENC: ERROR: Encoder is in bad state
02-25 03:50:35.432 2702 5521 E OMX-VENC: ERROR: async_msg_process() - Error statuscode = 1
02-25 03:50:35.432 2702 5520 E OMX-VENC: ERROR: OMX_COMPONENT_GENERATE_HARDWARE_ERROR!
02-25 03:50:36.459 2702 2702 E OMX-VENC: VIDIOC_REQBUFS OUTPUT_MPLANE Failed
02-25 03:50:36.459 2702 2702 E OMX-VENC: ERROR: venc_set_param input failed
02-25 03:50:36.459 2702 2702 E OMXNodeInstance: setParameter(0xebfc9b04:qcom.encoder.avc, ParamPortDefinition(0x2000001)) ERROR: UnsupportedSetting(0x80001019)
02-25 03:50:36.459 2672 5519 E ACodec : [OMX.qcom.video.encoder.avc] failed to set input port definition parameters.
02-25 03:50:36.460 2672 5519 E ExtendedACodec: [OMX.qcom.video.encoder.avc] configureCodec returning error -1010
02-25 03:50:36.460 2672 5519 E ACodec : signalError(omxError 0x80001001, internalError -1010)
02-25 03:50:36.460 2672 5519 E ACodec : [OMX.qcom.video.encoder.avc] configureCodec returning error -1010
02-25 03:50:36.460 2672 5519 E ACodec : signalError(omxError 0x80001001, internalError -1010)
02-25 03:50:36.460 2672 5518 E MediaCodec: Codec reported err 0xfffffc0e, actionCode 0, while in state 3
02-25 03:50:36.465 2672 3886 E MediaCodec: configure failed with err 0xfffffc0e, resetting...
02-25 03:50:36.465 2672 5518 E MediaCodec: Codec reported err 0xfffffc0e, actionCode 0, while in state 0
02-25 03:50:36.468 2702 2702 I OMX-VENC: Component Deinit
02-25 03:50:36.469 2702 2702 I OMX-VENC: Video encode perflock released
02-25 03:50:36.480 2672 5519 I OMXClient: IOmx service obtained
02-25 03:50:36.481 2702 2702 I OMXMaster: makeComponentInstance(OMX.qcom.video.encoder.avc) in omx@1.0-service process
02-25 03:50:36.494 568 588 E ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
02-25 03:50:36.495 2702 2702 I OMX-VENC: Video encode perflock acquired,handle=52
02-25 03:50:36.642 2702 2702 I OMX-VENC: Component_init : OMX.qcom.video.encoder.avc : return = 0x0
02-25 03:50:36.659 2702 2702 I OMX-VENC: Component Deinit
02-25 03:50:36.660 2702 2702 I OMX-VENC: Video encode perflock released
02-25 03:50:36.681 2672 5526 I OMXClient: IOmx service obtained
02-25 03:50:36.683 2702 3733 I OMXMaster: makeComponentInstance(OMX.google.h264.encoder) in omx@1.0-service process
02-25 03:50:36.689 2672 5518 I MediaCodec: MediaCodec will operate in async mode
02-25 03:50:36.691 2702 3733 E OMXNodeInstance: setConfig(0xebfa8020:google.h264.encoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001)
02-25 03:50:36.691 2672 5526 I ACodec : codec does not support config priority (err -2147483648)
02-25 03:50:36.692 2672 5526 I ExtendedACodec: setupVideoEncoder()
02-25 03:50:36.695 2672 5526 W OMXUtils: do not know color format 0x7f000789 = 2130708361
02-25 03:50:36.699 2672 5526 I ACodec : setupAVCEncoderParameters with [profile: Main] [level: Level41]
02-25 03:50:36.700 2672 5526 I ACodec : [OMX.google.h264.encoder] cannot encode color aspects. Ignoring.
02-25 03:50:36.701 2672 5526 I ACodec : [OMX.google.h264.encoder] cannot encode HDR static metadata. Ignoring.
02-25 03:50:36.701 2672 5526 I ACodec : setupVideoEncoder succeeded
02-25 03:50:36.701 2702 3733 E OMXNodeInstance: setConfig(0xebfa8020:google.h264.encoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001)
02-25 03:50:36.701 2672 5526 I ACodec : codec does not support config priority (err -2147483648)
02-25 03:50:36.702 2672 5526 W OMXUtils: do not know color format 0x7f000789 = 2130708361
02-25 03:50:36.702 2702 3733 E OMXNodeInstance: getConfig(0xebfa8020:google.h264.encoder, ConfigLatency(0x6f800005)) ERROR: Undefined(0x80001001)
02-25 03:50:36.703 2702 3733 E OMXNodeInstance: getConfig(0xebfa8020:google.h264.encoder, ConfigAndroidVendorExtension(0x6f100004)) ERROR: Undefined(0x80001001)
02-25 03:50:36.705 2672 5526 W ExtendedACodec: Failed to get extension for extradata parameter
02-25 03:50:36.709 2702 3733 D GraphicBufferSource: setting dataspace: 0x104, acquired=0
02-25 03:50:36.711 2702 3733 D GraphicBufferSource: requesting color aspects (R:2(Limited), P:1(BT709_5), M:1(BT709_5), T:3(SMPTE170M))
02-25 03:50:36.716 540 540 W AshmemAllocator: ashmem_create_region(12) returning hidl_memory(0x754802c100, 12)
02-25 03:50:36.741 540 540 W AshmemAllocator: ashmem_create_region(12) returning hidl_memory(0x754802c100, 12)
02-25 03:50:36.744 540 540 W AshmemAllocator: ashmem_create_region(731700) returning hidl_memory(0x754802c100, 731700)
02-25 03:50:36.745 540 540 W AshmemAllocator: ashmem_create_region(731700) returning hidl_memory(0x754802c100, 731700)
02-25 03:50:36.750 2702 5527 D SoftAVCEnc: Params width 720 height 1355 level 41 colorFormat 0
02-25 03:50:36.751 2702 5527 E SoftAVCEnc: Unable to set frame dimensions = 0x192
02-25 03:50:36.772 3170 3184 I DisplayManagerService: Display device added: DisplayDeviceInfo{"ScreenRecord": uniqueId="virtual:com.android.systemui,10053,ScreenRecord,0", 720 x 1355, modeId 2, defaultModeId 2, supportedModes [{id=2, width=720, height=1355, fps=60.0}], colorMode 0, supportedColorModes [0], HdrCapabilities null, density 283, 283.0 x 283.0 dpi, appVsyncOff 0, presDeadline 16666666, touch NONE, rotation 0, type VIRTUAL, state ON, owner com.android.systemui (uid 10053), FLAG_PRIVATE, FLAG_PRESENTATION}
02-25 03:50:36.775 2672 5112 I MPEG4Writer: limits: 4294967295/0 bytes/us, bit rate: 5242880 bps and the estimated moov size 3191 bytes
02-25 03:50:36.776 2672 5517 I MediaCodecSource: MediaCodecSource (video) starting
02-25 03:50:36.776 2672 5517 I MediaCodecSource: MediaCodecSource (video) started
02-25 03:50:36.789 2626 2626 D SurfaceFlinger: duplicate layer name: changing Display Root to Display Root#1
02-25 03:50:36.792 2626 2626 D SurfaceFlinger: duplicate layer name: changing Display Overlays to Display Overlays#1
02-25 03:50:36.799 2626 2626 D SurfaceFlinger: duplicate layer name: changing mBelowAppWindowsContainers to mBelowAppWindowsContainers#1
02-25 03:50:36.805 2626 2626 D SurfaceFlinger: duplicate layer name: changing animationLayer to animationLayer#1
02-25 03:50:36.808 2626 2626 D SurfaceFlinger: duplicate layer name: changing boostedAnimationLayer to boostedAnimationLayer#1
02-25 03:50:36.813 2626 2626 D SurfaceFlinger: duplicate layer name: changing homeAnimationLayer to homeAnimationLayer#1
02-25 03:50:36.816 2626 2626 D SurfaceFlinger: duplicate layer name: changing splitScreenDividerAnchor to splitScreenDividerAnchor#1
02-25 03:50:36.819 2626 2626 D SurfaceFlinger: duplicate layer name: changing mAboveAppWindowsContainers to mAboveAppWindowsContainers#1
02-25 03:50:36.822 2626 2626 D SurfaceFlinger: duplicate layer name: changing mImeWindowsContainers to mImeWindowsContainers#1
02-25 03:50:36.829 568 588 E ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
02-25 03:50:36.846 3170 3209 I ActivityManager: Override config changes=20005df8 {0.0 ?mcc?mnc ?localeList ?layoutDir sw407dp w407dp h766dp 283dpi nrml long port ?uimode ?night finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 720, 1355) mAppBounds=Rect(0, 0 - 720, 1355) mWindowingMode=fullscreen mActivityType=undefined}} for displayId=1
02-25 03:50:36.847 3694 3694 I Choreographer: Skipped 110 frames! The application may be doing too much work on its main thread.
02-25 03:50:36.852 3694 3994 I OpenGLRenderer: Davey! duration=1709ms; Flags=0, IntendedVsync=272947869316, Vsync=274640176966, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=274652559996, AnimationStart=274652629059, PerformTraversalsStart=274653662080, DrawStart=274653722496, SyncQueued=274653752653, SyncStart=274653934163, IssueDrawCommandsStart=274654106403, SwapBuffers=274656431924, FrameCompleted=274658027705, DequeueBufferDuration=427000, QueueBufferDuration=612000,
02-25 03:50:36.855 2626 2675 E : HpInterface: Wrong interface type.
02-25 03:50:36.856 3170 3209 I WindowManager: Screen frozen for +28ms due to new-config
02-25 03:50:36.867 3170 3445 I InputReader: Reconfiguring input devices. changes=0x00000004
02-25 03:50:36.873 2672 5112 W H2BGraphicBufferProducer: getConsumerUsage is not fully supported
02-25 03:50:36.874 3170 3881 I sysui_view_visibility: [127,0]
02-25 03:50:36.874 3170 3881 I sysui_multi_action: [757,127,758,2]
02-25 03:50:36.874 3170 3881 I notification_panel_hidden:
02-25 03:50:36.839 2626 2626 I auditd : type=1400 audit(0.0:192): avc: denied { call } for comm="Bi
...全文
3801 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
王冥 2019-05-08
  • 打赏
  • 举报
回复
华为mate20就有问题
mdqwuyan 2019-02-27
  • 打赏
  • 举报
回复
引用 5 楼 jklwan 的回复:
看代码用了很多高版本的api,而且视频宽高也是写死的。
最低api设置的多少,都是什么手机报错的。


是这值设错了setVideoSize;已改好,谢谢。
jklwan 2019-02-26
  • 打赏
  • 举报
回复
setParameter设置了不合法的属性。 上代码看看。
usecf 2019-02-26
  • 打赏
  • 举报
回复
avc 看看你se权限设置没 高版本的手机对se要求比较严格
jklwan 2019-02-26
  • 打赏
  • 举报
回复
看代码用了很多高版本的api,而且视频宽高也是写死的。 最低api设置的多少,都是什么手机报错的。
mdqwuyan 2019-02-26
  • 打赏
  • 举报
回复
引用 2 楼 jklwan 的回复:
setParameter设置了不合法的属性。
上代码看看。


调用的地方:没发现哪部错了:
import android.Manifest;
import android.content.res.Resources;
import android.content.Context;
import android.content.Intent;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionManager;
import android.os.IBinder;
import android.os.Handler;
import android.os.Bundle;
import android.os.ServiceManager;
import android.os.RemoteException;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.graphics.drawable.Drawable;
import android.service.quicksettings.Tile;
import android.widget.Switch;
import android.net.Uri;
import android.util.Log;
import android.util.DisplayMetrics;

import java.io.File;

import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.ScreenRecordService;
import com.android.systemui.qs.tileimpl.QSTileImpl;

/** Quick settings tile: ScreenRecord **/
public class ScreenRecordTile extends QSTileImpl<BooleanState> {

private static final String DIR_TYPE = "resource/folder";
private static final String OPEN_PATH = "/sdcard/ScreenRecord/";

private final Icon mIcon = ResourceIcon.get(R.drawable.ic_qs_screen_record);

private MediaProjectionManager mMediaProjectionManager;
private MediaProjection mMediaProjection;
private ScreenRecordService recordService;
Handler mHandler = new Handler();

private final Runnable mStartRecordRun = new Runnable() {
@Override
public void run() {
mMediaProjection = getMediaProjection();
recordService.setMediaProject(mMediaProjection);
boolean start = recordService.startRecord();
if(start == false)
recordService.stopRecord();
}
};

public ScreenRecordTile(QSHost host) {
super(host);
mMediaProjectionManager = (MediaProjectionManager)mContext.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent intent = new Intent(mContext, ScreenRecordService.class);
mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE);
}

private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
DisplayMetrics metrics = new DisplayMetrics();
Resources res = mContext.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
ScreenRecordService.ScreenRecordBinder binder = (ScreenRecordService.ScreenRecordBinder) service;
recordService = binder.getScreenRecordService();
recordService.setConfig(dm.widthPixels, dm.heightPixels, dm.densityDpi);
}

@Override
public void onServiceDisconnected(ComponentName arg0)
{
}
};

@Override
protected void handleDestroy() {
super.handleDestroy();
mContext.unbindService(connection);
}

@Override
public BooleanState newTileState() {
return new BooleanState();
}

@Override
public void handleSetListening(boolean listening) {

}

@Override
protected void handleUserSwitch(int newUserId) {
handleRefreshState(newUserId);
}

@Override
public Intent getLongClickIntent() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
File file = new File(OPEN_PATH);
intent.setDataAndType(Uri.fromFile(file), DIR_TYPE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
return intent;
}

@Override
protected void handleClick() {

//if(checkPermission() == false)
// return;
mHost.collapsePanels();
if(recordService.isRunning())
{
recordService.stopRecord();
mMediaProjection = null;
}
else
{
mHandler.postDelayed(mStartRecordRun, 500);
}

boolean newState = !mState.value;
refreshState(newState);
}
public MediaProjection getMediaProjection()
{
String packageName = "com.android.systemui";
PackageManager packageManager = mContext.getPackageManager();
ApplicationInfo aInfo;
int uid;
try {
aInfo = packageManager.getApplicationInfo(packageName, 0);
uid = aInfo.uid;
} catch (PackageManager.NameNotFoundException e) {
Log.e("ScreenRecordTile", "unable to look up package name", e);
return null;
}
try{
IBinder b = ServiceManager.getService(Context.MEDIA_PROJECTION_SERVICE);
IMediaProjectionManager service = IMediaProjectionManager.Stub.asInterface(b);
IMediaProjection projection = service.createProjection(uid, packageName,MediaProjectionManager.TYPE_SCREEN_CAPTURE, true);
return new MediaProjection(mContext,projection);
}catch (RemoteException e) {
Log.e("ScreenRecordTile", "Error IMediaProjection ", e);
return null;
}
}
/*public boolean checkPermission()
{
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
return false;
}

if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.RECORD_AUDIO}, 0);
return false;
}
return true;
}*/

@Override
public CharSequence getTileLabel() {
return mContext.getString(R.string.qs_screen_record);
}

@Override
protected void handleUpdateState(BooleanState state, Object arg) {
if (state.slash == null) {
state.slash = new SlashState();
}
if (arg instanceof Boolean) {
boolean value = (Boolean) arg;
//Log.d("ScreenRecordTile", "value = "+value+";state.value = "+state.value);
if (value == state.value) {
return;
}
state.value = value;
} else {
state.value = (recordService!=null && recordService.isRunning());
}
state.slash.isSlashed = false;
state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
state.label = mContext.getString(R.string.qs_screen_record);
state.icon = mIcon;
state.expandedAccessibilityClassName = Switch.class.getName();
state.contentDescription = state.label;
}

@Override
public int getMetricsCategory() {
return MetricsEvent.QS_COLORINVERSION;
}

@Override
protected String composeChangeAnnouncement() {
return mContext.getString(R.string.qs_screen_record);
}
}
mdqwuyan 2019-02-26
  • 打赏
  • 举报
回复
引用 1 楼 jklwan 的回复:
setParameter设置了不合法的属性。
上代码看看。



这是service:public class ScreenRecordService extends Service {

private MediaProjection mediaProjection;
private MediaRecorder mediaRecorder;
private VirtualDisplay virtualDisplay;

private boolean mRunning;
private int width = 1080;
private int height = 1920;
private int dpi;

WindowManager.LayoutParams mParams;
WindowManager mWindowManager;
TextView mStopButton;
LinearLayout mPopupWindow;
TextView mTime;
ImageView mDot;
private int mStatusBarHeight;

private float mInViewX;
private float mInViewY;
private float mDownInScreenX;
private float mDownInScreenY;
private float mInScreenX;
private float mInScreenY;

private int mMinute = 0;
private int mSecond = 0;

private ValueAnimator mTimeAnim;

@Override
public IBinder onBind(Intent intent) {
return new ScreenRecordBinder();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}

@Override
public void onCreate() {
super.onCreate();
//HandlerThread serviceThread = new HandlerThread("service_thread",android.os.Process.THREAD_PRIORITY_BACKGROUND);
//serviceThread.start();
mRunning = false;
mediaRecorder = new MediaRecorder();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
}

@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
if (mTimeAnim != null) {
mTimeAnim.cancel();
mTimeAnim = null;
}
}

public void setMediaProject(MediaProjection project) {
mediaProjection = project;
}
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent intent) {
String action = intent.getAction();
if(Intent.ACTION_SCREEN_OFF.equals(action)){
if(isRunning())
stopRecord();
}

}
};

public boolean isRunning() {
//Log.d("ScreenRecordTile", "mRunning = "+mRunning);
return mRunning;
}

public void setConfig(int w, int h, int d) {
this.width = w;
this.height = h;
this.dpi = d;
//Log.d("ScreenRecordTile", "width = "+width+" ; height = "+height+" ; dpi = "+dpi);
}

public boolean startRecord() {
if (mediaProjection == null || mRunning) {
return false;
}
initRecorder();
createVirtualDisplay();
mediaRecorder.start();
mRunning = true;
showButtonPopupWindow();
return true;
}
public boolean stopRecord() {
// if (!mRunning) {
// return false;
// }
mRunning = false;
if(mediaRecorder != null)
{
mediaRecorder.stop();
mediaRecorder.reset();
}
if(virtualDisplay != null) virtualDisplay.release();
virtualDisplay = null;
if(mediaProjection != null) mediaProjection.stop();
mediaProjection = null;
removeButtonPopupWindow();
return true;
}

private void createVirtualDisplay() {
virtualDisplay = mediaProjection.createVirtualDisplay("ScreenRecord", width, height, dpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.getSurface(), null, null);
}
private void showButtonPopupWindow() {
mParams = new WindowManager.LayoutParams();
if(mWindowManager == null)
mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
mParams.format = PixelFormat.RGBA_8888;
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mParams.gravity = Gravity.LEFT | Gravity.TOP;
mParams.x = 0;
mParams.y = 30;
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
LayoutInflater inflater = LayoutInflater.from(getApplication());
mPopupWindow = (LinearLayout) inflater.inflate(R.layout.qs_screen_record_popup,null);
mWindowManager.addView(mPopupWindow,mParams);
mPopupWindow.measure(View.MeasureSpec.UNSPECIFIED,View.MeasureSpec.UNSPECIFIED);
mStatusBarHeight = getResources().getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
mStopButton = (TextView) mPopupWindow.findViewById(R.id.stop);
mTime = (TextView) mPopupWindow.findViewById(R.id.time);
mDot = (ImageView) mPopupWindow.findViewById(R.id.dot);
setFlickerAnimation(mDot);
mTime.setText("00:00");
startTimeAnimation();
/*mStopButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
stopRecord();
}
});*/

mPopupWindow.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mInViewX = event.getX();
mInViewY = event.getY();
mDownInScreenX = event.getRawX();
mDownInScreenY = event.getRawY() - mStatusBarHeight;
mInScreenX = event.getRawX();
mInScreenY = event.getRawY() - mStatusBarHeight;
break;
case MotionEvent.ACTION_MOVE:
mInScreenX = event.getRawX();
mInScreenY = event.getRawY() - mStatusBarHeight;
mParams.x = (int) (mInScreenX- mInViewX);
mParams.y = (int) (mInScreenY - mInViewY);
mWindowManager.updateViewLayout(mPopupWindow, mParams);
break;
case MotionEvent.ACTION_UP:
if (mDownInScreenX == mInScreenX && mDownInScreenY == mInScreenY){
//if(mDownInScreenX > mPopupWindow.getMeasuredWidth()/2)
vibrate(100);
stopRecord();
}
break;
}
return true;
}
});
}
private void vibrate(long duration) {
Vibrator Vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
Vibrator.vibrate(duration);
}
private void setFlickerAnimation(ImageView view) {
Animation animation = new AlphaAnimation(1, 0);
animation.setDuration(1);
animation.setInterpolator(new LinearInterpolator());
animation.setRepeatCount(Animation.INFINITE);
animation.setRepeatMode(Animation.REVERSE);
animation.setStartOffset(800);
view.setAnimation(animation);
}
private void startTimeAnimation()
{
if(mTimeAnim == null)
{
mTimeAnim = ValueAnimator.ofInt(0,1);
mTimeAnim.addListener(new Animator.AnimatorListener(){
@Override
public void onAnimationStart(Animator animation){

}
@Override
public void onAnimationEnd(Animator animation){

}
@Override
public void onAnimationCancel(Animator animation){

}
public void onAnimationRepeat(Animator animation){
Log.d("ScreenRecordTile", "onAnimationRepeat mSecond = "+mSecond);
mSecond++;
if(mSecond >= 60)
{
mMinute ++;
mSecond = 0;
}
if(mMinute > 99)
mTime.setText(String.format("%1$d:%2$02d",mMinute,mSecond ));
else
mTime.setText(String.format("%1$02d:%2$02d",mMinute,mSecond ));
}
});
mTimeAnim.setDuration(1000);
mTimeAnim.setRepeatCount(Animation.INFINITE);
mTimeAnim.setRepeatMode(Animation.RESTART);
}
mTimeAnim.start();
}
private void removeButtonPopupWindow() {
if(mWindowManager != null)
mWindowManager.removeView(mPopupWindow);
stopTimeAnimation();
}

private void initRecorder() {
//Log.d("ScreenRecordTile", "initRecorder");
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_HHmmss");
Date curDate = new Date(System.currentTimeMillis());
String date = formatter.format(curDate);
// mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setOutputFile(getSaveDirectory() + "ScreenRecord_" +date + ".mp4");
mediaRecorder.setVideoSize(width, height);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
//mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);
mediaRecorder.setVideoFrameRate(30);
try {
mediaRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}

public String getSaveDirectory() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String rootDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "ScreenRecord" + "/";

File file = new File(rootDir);
if (!file.exists()) {
if (!file.mkdirs()) {
return null;
}
}

// Toast.makeText(getApplicationContext(), rootDir, Toast.LENGTH_SHORT).show();

return rootDir;
} else {
return null;
}
}
public void stopTimeAnimation()
{
mMinute = 0;
mSecond = 0;
if (mTimeAnim != null) {
mTimeAnim.cancel();
mTimeAnim = null;
}
}
public class ScreenRecordBinder extends Binder {
public ScreenRecordService getScreenRecordService() {
return ScreenRecordService.this;
}
}

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧