⑴ android 摄像头 环境光 brightness value 怎么提取
这里将摄像头采集及视频图像绘制放在一个模块中,比较便于管理及维护,同时在使用时,因为该类继承自view类,所以可以向操作很多view类一样,将其添加到任何布局中,在与采集的数据宽高比例保持一致的前提下,在页面显示上可以非常灵活的控制视图尺寸大小。不过使用这种方式实现摄像头预览,最大的瓶颈是在旋转yuv数据及将其转为rgb数据时,计算比较耗时,一般情况下采集640*480数据还好,但对于960*720数据来说,手机性能一般的话,就会显得比较卡了。解决方式在做数据旋转时,可以尝试采用ndk c的方式,以提高运行效率,在做yuv转rgb时,也可以尝试用ndk c的方式,但是最好的方式是采用gpu shader方式,直接渲染yuv数据,即将采集的yuv数据以纹理的方式上传至gpu,然后由gpu完成yuv转rgb并显示。下面是相关代码:
java">
{
//源视频帧宽/高
privateintsrcFrameWidth=640;
privateintsrcFrameHeight=480;
privateintframeSize=srcFrameWidth*srcFrameHeight;
privateintqtrFrameSize=srcFrameWidth*srcFrameHeight>>2;
//帧预览贴图
privateBitmappreviewBmp=null;
privateRectpreviewRect=null;
privateCameracamera=null;
//图层
privateBaseLayer[]layers=null;
//数据采集
privateint[]rgb_data=null;
privatebyte[]yuvdata=null;
//摄像头前置/后置
publicstaticfinalintCAMERA_BACK=0;
publicstaticfinalintCAMERA_FRONT=1;
privateintcurCameraIndex=CAMERA_BACK;
publicCameraView(Context_context)
{
super(_context);
}
publicCameraView(Context_context,AttributeSet_attrs)
{
super(_context,_attrs);
}
publicCameraView(Contextcontext,intpreviewWidth,intpreviewHeight,intcameraIndex)
{
super(context);
curCameraIndex=cameraIndex;
rgb_data=newint[frameSize];
yuvdata=newbyte[frameSize*3/2];
previewBmp=Bitmap.createBitmap(srcFrameHeight,srcFrameWidth,Config.ARGB_8888);
previewRect=newRect(0,0,previewWidth,previewHeight);
//定义图层
layers=newBaseLayer[2];
layers[0]=newTextLayer(context,0,false);
layers[1]=newImageLayer(context,1,false);
//文字
((TextLayer)layers[0]).setFontParams(32,Color.CYAN);
((TextLayer)layers[0]).setTextPos(100,300);
((TextLayer)layers[0]).setContent("天气还不错....");
layers[0].setVisible(true);
//图像
((ImageLayer)layers[1]).setImagePos(100,150);
layers[1].setVisible(true);
//初始化并打开摄像头
startCamera(cameraIndex);
this.setBackgroundColor(Color.parseColor("#82858b"));
}
//根据索引初始化摄像头
publicvoidstartCamera(intcameraIndex)
{
//先停止摄像头
stopCamera();
//再初始化并打开摄像头
if(camera==null)
{
camera=Camera.open(cameraIndex);
Camera.Parametersparams=camera.getParameters();
params.setPreviewSize(srcFrameWidth,srcFrameHeight);
params.setPreviewFormat(ImageFormat.NV21);
camera.setParameters(params);
camera.setPreviewCallback(this);
camera.startPreview();
}
}
//停止并释放摄像头
publicvoidstopCamera()
{
if(camera!=null)
{
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera=null;
}
}
//绘制
@Override
protectedvoidonDraw(Canvascanvas)
{
super.onDraw(canvas);
//填充数据(因为数据已经旋转过,此时宽与高需要互换)
previewBmp.setPixels(rgb_data,0,srcFrameHeight,0,0,srcFrameHeight,srcFrameWidth);
//绘制图层
for(BaseLayerlayer:layers)
{
if(layer.isVisible())
{
layer.drawLayer(previewBmp);
}
}
//贴图
canvas.drawBitmap(previewBmp,null,previewRect,null);
}
//获取摄像头视频数据
@Override
publicvoidonPreviewFrame(byte[]data,Cameracamera)
{
inti=0,j=0,k=0;
intuvHeight=srcFrameHeight>>1;
//旋转yuv数据
if(curCameraIndex==CAMERA_BACK)
{
//旋转y
for(i=0;i<srcFrameWidth;i++)
{
for(j=srcFrameHeight-1;j>=0;j--)
{
yuvdata[k]=data[srcFrameWidth*j+i];
k++;
}
}
//旋转uv
for(i=0;i<srcFrameWidth;i+=2)
{
for(j=uvHeight-1;j>=0;j--)
{
yuvdata[k]=data[frameSize+srcFrameWidth*j+i+1];//cb/u
yuvdata[k+qtrFrameSize]=data[frameSize+srcFrameWidth*j+i];//cr/v
k++;
}
}
}
else
{
//旋转y
for(i=srcFrameWidth-1;i>=0;i--)
{
for(j=srcFrameHeight-1;j>=0;j--)
{
yuvdata[k]=data[srcFrameWidth*j+i];
k++;
}
}
//旋转uv
for(i=srcFrameWidth-2;i>=0;i-=2)
{
for(j=uvHeight-1;j>=0;j--)
{
yuvdata[k]=data[frameSize+srcFrameWidth*j+i+1];//cb/u
yuvdata[k+qtrFrameSize]=data[frameSize+srcFrameWidth*j+i];//cr/v
k++;
}
}
}
//yuv转rgb(因为数据已经旋转过,此时宽与高需要互换)
intyp=0;
for(i=0,yp=0;i<srcFrameWidth;i++)
{
intuvp=frameSize+(i>>1)*uvHeight,u=0,v=0;
for(j=0;j<srcFrameHeight;j++,yp++)
{
inty=(0xff&yuvdata[yp])-16;
if((j&1)==0)
{
u=(0xff&yuvdata[uvp+(j>>1)])-128;
v=(0xff&yuvdata[uvp+qtrFrameSize+(j>>1)])-128;
}
inty1192=1192*y;
intr=(y1192+1634*v);
intg=(y1192-833*v-400*u);
intb=(y1192+2066*u);
if(r<0)r=0;elseif(r>262143)r=262143;
if(g<0)g=0;elseif(g>262143)g=262143;
if(b<0)b=0;elseif(b>262143)b=262143;
rgb_data[i*srcFrameHeight+j]=0xff000000|((r<<6)&0xff0000)|((g>>2)&0xff00)|((b>>10)&0xff);
}//for
}//for
invalidate();
}
⑵ android 如何调控闪光灯亮度
这是与设备相关的,因为硬件厂商才能自行定义硬件的属性。比如htc为相机闪光灯设置一个亮度文件,通过改写这个文件的值,可以达到变更相机闪光灯的亮度,魅族应该也是这样操作的。作为安卓系统来说,没有统一的解决方案的。
参考htc闪光灯亮度root下的设置方法:
on 2.2 HTC devices you can use it by writing a string to/sys/devices/platform/flashlight.0/leds/flashlight/brightness. This controls if the LED is on and how bright it is. For maximum brightness write "128\n", half brightness write "64\n". Easy to test from adb shell:
⑶ 安卓怎么通过修改系统文件,使屏幕亮度值的最低亮度更低
一、所需工具
1、APKTOOLS反编译工具;
2、配置JAVA环境;
3、Notepad++;
4、提取系统framework-res.apk文件;
二、具体操作
1、因为framework-res.apk是系统文件,我们需要首先加载系统环境,将framework-res.apk放入APKTOOLS文件夹下进行加载。如图:
5、我们修改好以后回编译、签名、替换即可。
拓展资料:
反编译framework-res.apk
打开framework-res
esvaluesintegers.xml
然后找到
<integer name="config_">
10</integer> 最低亮度
<integer name="config_">
255</integer> 最高亮度
<integer name="config_">
102</integer> 开机默认亮度
<integer name="config_screenBrightnessDim"> 10</integer> 变暗值
手动修改最低亮度值即可,一般改为1。(0以下未尝试过)。
⑷ android 怎么设置屏幕亮度
/**
* 获得当前屏幕亮度的模式
* SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度
* SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度
*/
private int getScreenMode(){
int screenMode=0;
try{
screenMode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
}
catch (Exception localException){
}
return screenMode;
}
/**
* 获得当前屏幕亮度值 0--255
*/
private int getScreenBrightness(){
int screenBrightness=255;
try{
screenBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
}
catch (Exception localException){
}
return screenBrightness;
}
/**
* 设置当前屏幕亮度的模式
* SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度
* SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度
*/
private void setScreenMode(int paramInt){
try{
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, paramInt);
}catch (Exception localException){
localException.printStackTrace();
}
}
/**
* 设置当前屏幕亮度值 0--255
*/
private void saveScreenBrightness(int paramInt){
try{
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, paramInt);
}
catch (Exception localException){
localException.printStackTrace();
}
}
/**
* 保存当前的屏幕亮度值,并使之生效
*/
private void setScreenBrightness(int paramInt){
Window localWindow = getWindow();
WindowManager.LayoutParams localLayoutParams = localWindow.getAttributes();
float f = paramInt / 255.0F;
localLayoutParams.screenBrightness = f;
localWindow.setAttributes(localLayoutParams);
}
⑸ android 应用开发如何调节闪光灯亮度
这是与设备相关的,因为硬件厂商才能自行定义硬件的属性。比如htc为相机闪光灯设置一个亮度文件,通过改写这个文件的值,可以达到变更相机闪光灯的亮度,魅族应该也是这样操作的。作为安卓系统来说,没有统一的解决方案的。
参考htc闪光灯亮度root下的设置方法:
on 2.2 HTC devices you can use it by writing a string to/sys/devices/platform/flashlight.0/leds/flashlight/brightness. This controls if the LED is on and how bright it is. For maximum brightness write "128\n", half brightness write "64\n". Easy to test from adb shell:
⑹ Android亮度调节的几种实现方法
Android亮度调节分为三个层次,分别是:Android系统亮度调节、Android App亮度调节和Android当前屏幕(Window)亮度调节。
1.Android系统亮度调节
Android系统亮度调节全局性最高,常见于系统设置中的亮度设置项。Android中提供了获取和设置系统亮度值(“手动模式下的亮度值”)的接口,具体如下:
// 获取系统亮度
Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
// 设置系统亮度
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);
2.Android App亮度调节
与系统亮度不同的是,Android中并未直接提供针对于App层面的亮度调节方式。因此,对于需要进行App的亮度调节,可以通过系统亮度调节或当前屏幕的亮度调节方式间接来实现。
3.Android当前屏幕(Window)亮度调节
Android针对当前屏幕(Window)提供了设置亮度的接口,常见写法如下:Window window = activity.getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.screenBrightness = brightness;window.setAttributes(lp);
⑺ android5.x怎么修改屏幕亮度
首选,需要反编译framework-res.apk,位于/system/framework/目录下。需要改动的位置为:integers.xml此文件位于:\res\values 目录下。
有几个值可以自定义
1,屏幕亮度设置的最小值:
查找词条:
config_
设置中可以调的最小亮度值。将其值修改为比5大的值。修改的过低可能点不亮屏幕。。自己斟酌。
2,屏幕亮度设置的最大值:
查找词条:
config_
一般为255最大。不需要改。
3,屏幕亮度设置的默认值:
查找词条:
config_
一般为102。不需要改。
4,屏幕变暗时的值:
查找词条:
config_screenBrightnessDim
当屏幕即将关闭时的值。推荐将其值修改为比5大的值。修改的过低可能点不亮屏幕。。自己斟酌。
5,屏幕完全黑暗时的值:
查找词条:
config_screenBrightnessDark
推荐将其修改为比5大的值。修改的过低可能点不亮屏幕。自己斟酌。