酷派Cool S1怎么样?一张图看懂酷派改变者S1优缺点
前天,酷派在上海召开新品发布会,推出了最新的旗舰手机酷派改变者S1。作为年底的压轴明星产品,酷派改变者S1可谓集万千风光于一身。该手机共有暗夜黑、恒河金、流光黑三种配色,标配版(4+64GB)售价2499元,高配版(6+64GB)2699元,流光黑顶配版(6+128GB)3199元。接下来我们就通过一张图来迅速地了解一下酷派改变者S1。
以上就是小编为大家带来的一张图看懂酷派改变者S1优缺点介绍的全部内容,感谢大家的阅读。
华为Mate9怎么隐藏应用呢?相信很多用户想知道的吧,接下来小编为大家介绍一下华为Mate9怎么隐藏应用教程,有兴趣的一起来了解一下。华为Mate9隐藏应用方法
将手机解锁成功之后,进入手机主界面,两手指在桌面外扩,就会出现隐藏程序的界面。此时,我们主要点击添加按钮即可以将程序隐藏起来,不被别人看到。当我们需要打开的时候,打开隐藏程序界面,找到对应的应用打开就可以了。
第一步:手机主界面,两手指在桌面外扩。
第二步:隐藏程序的界面。
第三步:打开隐藏程序界面,找到对应的应用打开就可以了。
刚买来的华为Mate9怎么导入联系人呢?一个一个输入又太麻烦,下面小编就为你们分享华为Mate9显示并导入SIM卡联系教程,一起来看看吧。华为Mate9导入SIM卡联系人方法步骤:
一、首先将SIM卡安装到华为Mate9手机中,然后从华为Mate9桌面打开联系人,当我们进入空联系人的时候,选择【导入联系人】,如图所示:
二、导入联系人的方式有三种:存储设备、SIM卡、其他手机,这里我们通过SIM卡讲联系人导入,如图所示:
三、最后,点击联系人设置,选择【精准识别】,简洁模式,显示SIM联系人,可以最好的显示手机联系人,如图所示:
以上就是小编给大家推荐的导入SIM卡上联系人并用合适的方式显示SIM卡联系人的方法。除此之外,还可以使用华为云服务同样能同步我们的联系人。以上直接导入的方法比起华为云服务它优点在于过滤重复联系人隐藏一些不必要的信息,机友们如何选择呢?
小编推荐的这篇教程介绍了如何用安卓实现偷拍功能的实例代码,有兴趣的同学不妨来动手尝试一下吧。Android 偷拍功能/手机关闭能拍照
效果如下:
其实偷拍与偷录实现方式是一样的,都是使用到的WindowManager来绘制桌面小控件的原理。那我就不多说了…
一、首先我们需要一个SurfaceView:
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/small_window_layout"
android:layout_width="1dip"
android:layout_height="1dip"
>
<FrameLayout
android:id="@+id/percent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
/>
</LinearLayout>
|
二、然后进行的操作就是生产这个小控件了:
publicPhotoWindowSmallView(Context context) {
super(context);
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater.from(context).inflate(R.layout.float_window_small,this);
View view = findViewById(R.id.small_window_layout);
viewWidth = view.getLayoutParams().width;
viewHeight = view.getLayoutParams().height;
// SurfaceView percentView = (SurfaceView) findViewById(R.id.percent);
// percentView.setText(MyWindowManager.getUsedPercentValue(context));
}
/**
* 将小悬浮窗的参数传入,用于更新小悬浮窗的位置。
*
* @param params 小悬浮窗的参数
*/
publicvoidsetParams(WindowManager.LayoutParams params) {
mParams = params;
}
|
三、那桌面控件有了,下面当然就是使用WindowManager添加到桌面上了:
/**
* 创建一个小悬浮窗。初始位置为屏幕的右部中间位置。
*
* @param context 必须为应用程序的Context.
*/
publicvoidcreateSmallWindow(Context context) {
mContext = context;
WindowManager windowManager = getWindowManager(context);
intscreenWidth = windowManager.getDefaultDisplay().getWidth();
intscreenHeight = windowManager.getDefaultDisplay().getHeight();
if(smallWindow ==null) {
smallWindow =newPhotoWindowSmallView(context);
if(smallWindowParams ==null) {
smallWindowParams =newLayoutParams();
smallWindowParams.type = LayoutParams.TYPE_PHONE;
smallWindowParams.format = PixelFormat.RGBA_8888;
smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
smallWindowParams.width = PhotoWindowSmallView.viewWidth;
smallWindowParams.height = PhotoWindowSmallView.viewHeight;
smallWindowParams.x = screenWidth;
smallWindowParams.y = screenHeight /2;
}
smallWindow.setParams(smallWindowParams);
windowManager.addView(smallWindow, smallWindowParams);
mSurfaceview = (FrameLayout) smallWindow.findViewById(R.id.percent);
}
}
/**
* 将小悬浮窗从屏幕上移除。
*
* @param context 必须为应用程序的Context.
*/
publicvoidremoveSmallWindow(Context context) {
if(smallWindow !=null) {
WindowManager windowManager = getWindowManager(context);
windowManager.removeView(smallWindow);
smallWindow =null;
}
}
|
四、这个时候我们需要的SurfaceView就有了,那么,怎么在后台进行操作呢?自然而然就想到了Service了
在Service中执行桌面控件的操作:
@Override
publicintonStartCommand(Intent intent,intflags,intstartId) {
myWindowManager =newMyPhotoWindowManager();
createWindow();
returnsuper.onStartCommand(intent, flags, startId);
}
@Override
publicvoidonDestroy() {
super.onDestroy();
}
privatevoidcreateWindow() {
// 当前界面是桌面,且没有悬浮窗显示,则创建悬浮窗。
myWindowManager.removeSmallWindow(getApplicationContext());
myWindowManager.createSmallWindow(getApplicationContext());
}
|
五、在activity中对Service绑定,进行拍照的操作
privateclassMyServiceConnimplementsServiceConnection {
@Override
publicvoidonServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
binder = (PhotoWindowService.myServiceBinder) service;
if(isVedio) {
binder.startCarema();
}else{
binder.stopCarema();
}
}
@Override
publicvoidonServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
|
六、在Service中控制myWindowManager中的拍照的开始和结束
publicclassmyServiceBinderextendsBinder {
publicvoidstartCarema() {
myWindowManager.startCarema();
}
publicvoidstopCarema() {
myWindowManager.stopCarema();
}
}
|
七、在MyPhotoWindowManager开启或终止拍照操作
publicvoidstartCarema() {
itt = InitTimetoTakePic.getInstance(mContext);
itt.initView(mSurfaceview);
itt.start();
}
publicvoidstopCarema() {
if(itt !=null)
itt.releaseCarema();
}
|
八、在InitTimetoTakePic进行拍照的相关处理
packagecom.ddv.www.candidphotodemo;
importandroid.annotation.TargetApi;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.pm.PackageManager;
importandroid.hardware.Camera;
importandroid.hardware.Camera.AutoFocusCallback;
importandroid.hardware.Camera.PictureCallback;
importandroid.os.Build;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.widget.FrameLayout;
importjava.io.File;
importjava.io.FileOutputStream;
/**
* 设置定时拍照功能
*
* @author <p>
* 创建定时拍照任务
* cameraType 摄像头
* resolutionString 分辨率
* tvSaveLocation 保存地址
* etExtension 拓展名
* cameraStart, 开始拍摄时间
* cameraNumber, 拍摄次数
* cameraStop 拍摄张数
*/
publicclassInitTimetoTakePic {
privatestaticInitTimetoTakePic mInstance;
privatestaticintcameraType =1;
Context mContext;
staticFrameLayout mSurfaceViewFrame;
privatestaticCamera mCamera;
privatestaticCameraPreview mPreview;
privatestaticString resolutionString ="1920x1080";
privatestaticString saveLocation = AppUtils.getSDCardPath();
privatestaticString extension ="JPG";
privatestaticString cameraStart ="1";
privatestaticString cameraNumber ="1";
privatestaticString cameraStop ="10";
privatestaticintnumber =0;
privatestaticbooleanclearVoice =false;
privateIntent intent;
privateInitTimetoTakePic(Context context) {
this.mContext = context;
}
publicsynchronizedstaticInitTimetoTakePic getInstance(Context context) {
mInstance =null;
mInstance =newInitTimetoTakePic(context);
returnmInstance;
}
publicvoidinitView(FrameLayout surfaceViewFrame) {
mSurfaceViewFrame = surfaceViewFrame;
}
/**
* 启动定时拍照并上传功能
*/
Handler mHandler =newHandler() {
@Override
publicvoidhandleMessage(Message msg) {
switch(msg.what) {
case1:
LogUtils.v("开始拍照");
initCarema();
break;
case2:
if(mCamera ==null) {
releaseCarema();
number =0;
mHandler.removeCallbacksAndMessages(null);
}else{
if(number < Integer.valueOf(cameraStop)) {
mCamera.autoFocus(newAutoFocusCallback() {
@Override
publicvoidonAutoFocus(booleansuccess, Camera camera) {
// 从Camera捕获图片
LogUtils.v("自动聚焦111"+ success);
try{
mCamera.takePicture(null,null, mPicture);
mHandler.sendEmptyMessageDelayed(1, Integer.valueOf(cameraNumber) *1000);
}catch(Exception e) {
releaseCarema();
mHandler.removeCallbacksAndMessages(null);
}
}
});
}else{
releaseCarema();
number =0;
mHandler.removeCallbacksAndMessages(null);
}
}
break;
}
}
};
publicvoidstart() {
mHandler.sendEmptyMessageDelayed(1,1*1000);//7s 后开始启动相机
}
privatevoidinitCarema() {
LogUtils.v("initCarema");
if(mCamera ==null) {
LogUtils.v("camera=null");
mCamera = getCameraInstance();
mPreview =newCameraPreview(mContext, mCamera);
mSurfaceViewFrame.removeAllViews();
mSurfaceViewFrame.addView(mPreview);
}
LogUtils.v(mCamera ==null?"mCamera is null":"mCamera is not null");
mCamera.startPreview();
mHandler.sendEmptyMessageDelayed(2, Integer.valueOf(cameraStart) *1000);//3s后拍照
}
/**
* 检测设备是否存在Camera硬件
*/
privatebooleancheckCameraHardware(Context context) {
if(context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
// 存在
returntrue;
}else{
// 不存在
returnfalse;
}
}
/**
* 打开一个Camera
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
publicstaticCamera getCameraInstance() {
Camera c =null;
try{
c = Camera.open(cameraType);
c.setDisplayOrientation(90);
Camera.Parameters mParameters = c.getParameters();
//快门声音
c.enableShutterSound(clearVoice);
//可以用得到当前所支持的照片大小,然后
//List<Size> ms = mParameters.getSupportedPictureSizes();
//mParameters.setPictureSize(ms.get(0).width, ms.get(0).height); //默认最大拍照取最大清晰度的照片
String[] xes = resolutionString.split("x");
// LogUtils.i("ms.get(0).width==>"+ms.get(0).width);
// LogUtils.i("ms.get(0).height==>"+ms.get(0).height);
// LogUtils.i("Integer.valueOf(xes[0])==>"+Integer.valueOf(xes[0]));
// LogUtils.i("Integer.valueOf(xes[1])==>"+Integer.valueOf(xes[1]));
mParameters.setPictureSize(Integer.valueOf(xes[0]), Integer.valueOf(xes[1]));//默认最大拍照取最大清晰度的照片
c.setParameters(mParameters);
}catch(Exception e) {
LogUtils.v("打开Camera失败失败");
}
returnc;
}
privatePictureCallback mPicture =newPictureCallback() {
@Override
publicvoidonPictureTaken(byte[] data, Camera camera) {
// 获取Jpeg图片,并保存在sd卡上
String path = saveLocation;
File dirF =newFile(path);
if(!dirF.exists()) {
dirF.mkdirs();
}
File pictureFile =newFile(path +"/"+ System.currentTimeMillis() +"."+ extension);//扩展名
try{
FileOutputStream fos =newFileOutputStream(pictureFile);
fos.write(data);
fos.close();
LogUtils.v("保存图成功");
number++;
intent =newIntent();
intent.setAction("CameraFragment.start");
intent.putExtra("number", number);
mContext.sendBroadcast(intent);
}catch(Exception e) {
LogUtils.v("保存图片失败");
e.printStackTrace();
}
releaseCarema();
}
};
publicvoidreleaseCarema() {
if(mCamera !=null) {
mCamera.stopPreview();
mCamera.release();
mCamera =null;
}
}
}
|
相关文章
- 这篇文章主要介绍了c# 如何对CSV文件操作,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了JS双击变input框批量修改内容的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-01-09
- 多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分。而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍的是相对简单的...2015-10-21
- 这篇文章主要介绍了vue实现在进行增删改操作后刷新页面,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-05
- 这篇文章介绍的是利用C#设置自定义文件图标,然后实现双击启动的功能,文章给出了示例代码,介绍的很详细,有需要的可以参考借鉴。...2020-06-25
- 这篇文章主要介绍了利用C#修改Windows操作系统时间,帮助大家更好的利用c#操作系统,感兴趣的朋友可以了解下...2020-12-08
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
这篇文章主要介绍了JQuery EasyUI datagrid 添加、修改、删除操作的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-25- 本文实例讲述了mysql修改表结构方法。分享给大家供大家参考。具体如下:mysql修改表结构使用ALTER TABLE语句,下面就为您详细介绍mysql修改表结构的语句写法,希望对您学习mysql修改表结构方面能有所帮助。ALTER [IGNORE]...2015-10-21
- 这篇文章主要介绍了C#实现appSettings节点读取与修改的方法,是非常实用的技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Mybatis批量修改时出现报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-10
- 这篇文章主要介绍了C#实现修改系统时间的方法,是一个非常实用的功能,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了vbs小程序图标更改方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
- 这篇文章主要介绍了python批量修改交换机密码的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下...2020-09-22
- jquery easyui框架提供了创建网页所需要的一切,可以帮助大家建立站点,接下来,通过本文给大家介绍Jquery easyui开启行编辑模式增删改操作,感兴趣的朋友一起学习...2016-01-15
- 安卓手机充电提示音怎么添加更换呢?很多朋友最近对于充电提示音非常感兴趣,想要更换自己安卓手机的提示音但是不知道怎么操作,那么今天小编就为大家带来关于充电提示音更换方法...2020-12-08
- 这篇文章主要介绍了自动修改本机IP地址的bat代码,下面的代码因为时间问题暂时没有修复,但里面的一些判断还是值得学习的...2020-06-30
- db.execsql(sql); 或者db.insert()、db.delete()、db.update(),并且包括数据表的创建和删除等等也可以通过execsql实现 //创建表 代码如下 复制代码 ...2016-11-25
- 这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-04-30
- 这篇文章主要介绍了ASP.NET MVC5网站开发用户修改资料和密码,本文即将结束member区域的用户部分,感兴趣的小伙伴们可以参考一下...2021-09-22
- 这篇文章主要介绍了JavaScript 防篡改对象的用法示例,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以参考下...2021-04-23