android camera2 获取相机当前值的问题 50C

我想给主页面的seekBar动态赋值,要达到的效果是:
当我在自动调焦的情况下,晃动手机,由于焦距变换,seekbar的值会一直变。
怎样可以取到相机的当前值呢?那位大神可以帮我解决下?

1个回答

qq_29934141
qq_29934141 哥,这是camera1 的啊,camera2用不了,还有没有别的解决办法?
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

android camera api2

如何获取相机当前的属性值啊?我想给页面上的SeekBar动态的赋值, 比方说,自动调焦模式下,控制焦距的SeekBar可以跟随自动对焦的焦距值, 不断地刷新变化。 各位大神,这个怎么实现啊?

android preview时帧率问题

![![图片说明](https://img-ask.csdn.net/upload/201602/16/1455612367_767512.png)图片说明](https://img-ask.csdn.net/upload/201602/16/1455612354_344091.png)

android关于调用系统相机拍照后APP闪退的问题

最近在写一个小APP,就是调用系统相机拍照,然后保存在本地相册,代码没有显示bug,但是在调试时出现了拍照后闪退的问题,我的测试机是小米2S,MIUI 7系统,android5.0.X的,拍照的照片能保存在本地,但是在拍照后点击确定后软件就闪退了,这是我的代码 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.button1); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 调用系统相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.addCategory(Intent.CATEGORY_DEFAULT); // 取当前时间为照片名 String name = DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg"; Log.d("onactivity", "mPictureFile:" + name); picPath = getPhotopath() + name; // 通过文件创建一个uri中 Uri imageUri = Uri.fromFile(new File(picPath)); // 保存uri对应的照片于指定路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, OPEN_RESULT2); } }); } /** * 获取原图片存储路径 * * @return */ @SuppressLint("SimpleDateFormat") private String getPhotopath() { // 照片全路径 String fileName = ""; // 文件夹路径 String pathUrl = Environment.getExternalStorageDirectory() + "/DCIM/Camera/"; File file = new File(pathUrl); file.mkdirs();// 创建文件夹 fileName = pathUrl + fileName; return fileName; } ``` ```

关于竖屏相机调用横版拍照的系统相机问题

在我的程序里面,有个Activity是锁定竖屏的,点击拍照按钮,将会调用系统的相机进行拍照,现在遇到的问题是:如果这个系统相机是默认横屏拍照的,那么在程序跳转会发生横竖屏切换,在拍照返回结果的时候,我的Activity被重新创建了! 试过这个方法: 下面记录一下开发中遇到的问题,说道这里不得不吐槽一下三星的相机,调用之后系统会调用ondestroy导致activity被销毁重建,原因是系统调用了一次横竖屏切换,解决方法如下 方法一:刚开始调用了onSaveInstanceState(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)这个方法来实现,虽然方法比较笨,但是可以通过在onSaveInstanceState中保存一些你需要的变量,在onCreate()方法中判断savedInstanceState是否为null,不为null则调用onRestoreInstanceState()方法取出之前存的变量来使用,这相当于重新加载了一边当前activity。 方法二:上面的方法可行,但并不是解决问题的根本办法,后来通过查看发现在调用相机时,activity从竖屏切换到了横屏,在横竖屏切换导致了activity重新装载,找到根本原因后,在activity中通过android:configChanges="orientation|keyboardHidden" 这个属性,可以约束调用相机时,保持当前activity竖屏状态不变,从而解决了activity重新加载的问题。 ``` ``` 但是并不起作用。在拍照的时候,还是会出现问题。 另外也试过这个:http://www.zhihu.com/question/21541629(android 调用三星i9300系统相机出现Activity 自动onDestory?) 这个方案能保证Activity不被销毁,但是无法区分是拍照结果是取消还是确定,因为每一次调用返回的都是同一个值 所以想问一下,有没有什么处理方法 (我观察过,QQ也是调用系统相机,但是他不敢是在三星手机还是在其他手机上面,都能够很好的兼容,而58和赶集则是采用自己定义的相机,可能很大的原因就是避开系统相机的兼容性,更何况各种其他第三方相机) http://ask.csdn.net/#

Android摄像头视频帧数据保存

用Android手机自带的camera,采集视频信息,得到每帧中心点的像素值,写入到txt文档中,现在出现一个奇怪的问题:在onCreate()方法中,先创建好空的txt文档,用于后面的数据写入,视频处理后的帧率也快些,但是得到的数据与实际的有很大的出入;而在onPreviewFrame()方法中,读取每帧的时候重复创建空的txt文档,帧率是稍微降低些,但是数据更合理,不知道其中什么原因导致的、,各位大神,拜托了!(这个Android底层有关系么?)

在手机的Camera已经打开情况下,如何使用adb shell命令切换Camera前后摄像头?

在Android系统中,当Camera已经打开了, 但是想通过adb命令来控制选择前后摄像头,请问有什么办法,命令是多少? 当前知道的adb操作手机命令: 点亮/关闭屏幕 adb shell input keyevent 26 设置手机休眠时间 adb shell settings gett system screen_off_timeout(查看手机休眠时间) adb shell settings put system screen_off_timeout 600000(10分钟) adb shell settings put system screen_off_timeout 2147483647(常亮) 打开camera adb shell am start -a android.media.action.STILL_IMAGE_CAMERA

opencv4android开发获取摄像头帧数据处理后返回屏幕显示问题

我在JNI中用C++的opencv对图片进行了处理,就是在人脸上画了个框,但是传回Java再显示就没有框了(用同样的方法进行单张的图片处理就没问题),请问这是为什么以及该如何解决。部分代码如下: Java代码: ``` public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); Bitmap bmp_new = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(),Bitmap.Config.ARGB_8888); Utils.matToBitmap(mRgba, bmp_new, false); int w = bmp_new.getWidth(); int h = bmp_new.getHeight(); int[] pixels = new int[w*h]; bmp_new.getPixels(pixels, 0, w, 0, 0, w, h); int[] resultInt = facedetect(pixels, w, h); //native方法,在JNI进行处理,就是画框 Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888); resultImg.setPixels(resultInt, 0, w, 0, 0, w, h); Mat mat_bmp = new Mat(resultImg.getHeight(), resultImg.getWidth(), CvType.CV_8UC4); Utils.bitmapToMat(resultImg, mat_bmp, false); return mat_bmp; } ``` C++代码: ``` JNIEXPORT jintArray JNICALL Java_org_opencv_samples_facedetect_FdActivity_facedetect (JNIEnv *env, jclass obj, jintArray buf, jint w, jint h){ jint *cbuf; cbuf = env->GetIntArrayElements(buf, false); if(cbuf == NULL){ return 0; } Mat imgData(h, w, CV_8UC4, (unsigned char*)cbuf); //Load the cascades face_cascade.load( face_cascade_name ); eyes_cascade.load( eyes_cascade_name ); //detect&draw detectAndDisplay( imgData ); int size=w * h; jintArray result = env->NewIntArray(size); env->SetIntArrayRegion(result, 0, size, cbuf); env->ReleaseIntArrayElements(buf, cbuf, 0); return result; } /** * @function detectAndDisplay */ void detectAndDisplay( Mat frame ) { std::vector<Rect> faces; Mat frame_gray; cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); equalizeHist( frame_gray, frame_gray ); //-- Detect faces face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( size_t i = 0; i < faces.size(); i++ ) { Point center( faces.x + faces.width/2, faces.y + faces.height/2 ); ellipse( frame, center, Size( faces.width/2, faces.height/2), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 ); Mat faceROI = frame_gray( faces ); std::vector<Rect> eyes; //-- In each face, detect eyes eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( size_t j = 0; j < eyes.size(); j++ ) { Point eye_center( faces.x + eyes[j].x + eyes[j].width/2, faces.y + eyes[j].y + eyes[j].height/2 ); int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); circle( frame, eye_center, radius, Scalar( 255, 0, 0), 3, 8, 0 ); } } } ``` 希望大神能够告知问题所在。

如何获取psensor两次距离变化的时间差然后取消倒计时

获取psensor两次距离变化的时间差,不满2秒取消倒计时不起作用 Camera还是起来了,后面的Activity也跳转了 怎么回事 网上说是5.0以前不能CountDownTimer直接cancel,会不起作用。 但我开发环境6.0的,手机8.0的,为什么还是没用。 import android.app.Service; import android.content.Context; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.CountDownTimer; import android.os.IBinder; import android.os.PowerManager; import android.os.SystemClock; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.util.Log; import android.widget.Toast; public class SensorFunctionService extends Service { private SensorManager mSensorManager; private Sensor mPSensor; private PowerManager mPowerManager; private PowerManager.WakeLock mProximityWakeLock; private CountDownTimer timer; private long mLastProximityEventTime = 0; private long milliseconds; @Override public void onCreate() { super.onCreate(); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); mProximityWakeLock = mPowerManager.newWakeLock(32,"csl"); mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mPSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); if (null == mSensorManager) { Log.d("csl", "deveice not support SensorManager"); } SensorEventListener mSensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { Log.d("csl", "onSensorChanged 。。。。"); if (event.sensor == null) { return; } if (event.sensor.getType() == Sensor.TYPE_PROXIMITY){ float distance = event.values[0]; if (distance == 0.0) { milliseconds = SystemClock.elapsedRealtime(); } else { mLastProximityEventTime = SystemClock.elapsedRealtime(); } final long timeSinceLastEvent = mLastProximityEventTime - milliseconds; Log.d("xxxx"," data: " + distance +" +"+ milliseconds + " +"+mLastProximityEventTime + " +"+timeSinceLastEvent); if (distance == 0.0) { timer = new CountDownTimer(2000,1000) { @Override public void onTick(long millisUntilFinished) { if ((timeSinceLastEvent < 2000) && (timeSinceLastEvent >0)) { timer.cancel(); } } @Override public void onFinish() { //Intent intent = new Intent(SensorFunctionService.this, Main2Activity.class); //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK ); //startActivity(intent); Intent cameraIntent = new Intent(); // 指定开启系统相机的Action cameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.addCategory(Intent.CATEGORY_DEFAULT); cameraIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity(cameraIntent); timer = new CountDownTimer(5000,1000) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { Intent intent = new Intent(SensorFunctionService.this, Main2Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity(intent); Toast.makeText(SensorFunctionService.this,"onFinish", Toast.LENGTH_SHORT).show(); } }.start(); } }.start(); } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; mSensorManager.registerListener(mSensorEventListener, mPSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable() { @Override public void run() { } }); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }

安卓4.0版本的手机系统拍照和调用相册会导致崩溃、如果有人遇到类似情况可以分享交流一下

因项目需求实现了一个调用手机拍照和相册上传图片到服务器的功能,昨天测试了一下发现在4.0版本的手机系统就会导致崩溃 ## 崩溃原因:Failed to ensure directory: /storage/sdcard1/Android/data/ ![图片说明](https://img-ask.csdn.net/upload/201611/16/1479269331_358379.png) 1. 初始化操作: ``` //自定义的弹出框类 popw menuWindow; private String temppath; private Uri tempuri; private File finalfile; private File tempFile; /* 用来标识请求照相功能 */ private static final int CAMERA_WITH_DATA = 50; /* 用来标识请求gallery */ private static final int PHOTO_PICKED_WITH_DATA = 60; /* 用来标识裁剪的返回 */ private static final int CUT_PHOTO = 70; private int createnum=0; private static final File PHOTO_DIR = new File( Environment.getExternalStorageDirectory() + "/dotOrderImage"); ``` ``` //2.点击图片按钮调用的方法 private void setting() { setting_img.setOnClickListener(new OnClickListener() { public void onClick(View v) { //实例化SelectPicPopupWindow menuWindow = new popw(StoreSettingAty.this, itemsOnClick); //显示窗口 menuWindow.showAtLocation(StoreSettingAty.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置 } }); ``` ``` //3.为弹出窗口实现监听类 private OnClickListener itemsOnClick = new OnClickListener(){ public void onClick(View v) { menuWindow.dismiss(); switch (v.getId()) { //拍照 case R.id.btn_take_photo: { Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 if (!PHOTO_DIR.exists()) { boolean iscreat = PHOTO_DIR.mkdirs();// 创建照片的存储目录 } tempFile = new File(PHOTO_DIR, getPhotoFileName()); // tempFile = new File(Environment.getExternalStorageDirectory(), // getPhotoFileName()); // if (!tempFile.exists()) { // try { // tempFile.createNewFile(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } temppath=tempFile.getAbsolutePath(); // temppath=tempFile.getPath(); tempuri=Uri.fromFile(tempFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri); startActivityForResult(intent, CAMERA_WITH_DATA); } break; //相册 case R.id.btn_pick_photo: { Intent intent = new Intent(Intent.ACTION_PICK, null); /** * 下面这句话,与其它方式写是一样的效果,如果: * intent.setData(MediaStore.Images * .Media.EXTERNAL_CONTENT_URI); * intent.setType(""image/*");设置数据类型 * 如果朋友们要限制上传到服务器的图片类型时可以直接写如 * :"image/jpeg 、 image/png等的类型" */ intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent, PHOTO_PICKED_WITH_DATA); } break; default: break; } } }; ``` ``` // 4.使用系统当前日期加以调整作为照片的名称 private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat( "'IMG'_yyyyMMdd_HHmmss"); return dateFormat.format(date) + ".jpg"; } @Override protected void onResume() { System.out.println("onResume"); // // 切换屏幕方向会导致activity的摧毁和重建 // if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // System.out.println("屏幕切换"); // } super.onResume(); } /** * 保存裁剪之后的图片数据 &nbsp; * * @param picdata */ private void setPicToView(Intent picdata) { Bundle extras = picdata.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); finalfile=new File(PHOTO_DIR, getPhotoFileName()); BitmapUtils.saveImg(photo, finalfile); // Log.i("finalfile", finalfile.getAbsolutePath()); Drawable drawable = new BitmapDrawable(photo); /**I * 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上 传到服务器,QQ头像上传采用的方法跟这个类似 */ /* * ByteArrayOutputStream stream = new ByteArrayOutputStream(); * photo.compress(Bitmap.CompressFormat.JPEG, 60, stream); byte[] b * = stream.toByteArray(); // 将图片流以字符串形式存储下来&nbsp; tp = new * String(Base64Coder.encodeLines(b)); * 这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了, 服务器处理的方法是服务器那边的事了,吼吼&nbsp; * 如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换 为我们可以用的图片类型就OK啦...吼吼 * Bitmap dBitmap = BitmapFactory.decodeFile(tp); Drawable drawable * = new BitmapDrawable(dBitmap); */ setting_img.setImageDrawable(drawable); } } /** * 裁剪图片方法实现 &nbsp; * * @param uri */ public void startPhotoZoom(Uri uri) { /* * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页 * yourself_sdk_path/docs/reference/android/content/Intent.html * 直接在里面Ctrl+F搜:CROP ,之前没仔细看过,其实安卓系统早已经有自带图片裁剪功能, 是直接调本地库的 */ Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 500); intent.putExtra("outputY", 500); intent.putExtra("return-data", true); startActivityForResult(intent, CUT_PHOTO); } ``` ``` //5.回调 protected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println("onActivityResult"); if (resultCode == RESULT_OK) { switch (requestCode) { // 如果是直接从相册获取 case PHOTO_PICKED_WITH_DATA: if (data != null && data.getData() != null) { startPhotoZoom(data.getData()); //System.out.println("data.getData()"+data.getData()); } break; // 如果是调用相机拍照时 case CAMERA_WITH_DATA: Log.i("resultCode", resultCode+""); if(resultCode==0){ return; } Log.i("createnum", createnum+""); startPhotoZoom(tempuri); break; // 取得裁剪后的图片 case CUT_PHOTO: /** * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,要重新裁剪,丢弃 * 当前功能时,会报NullException,只 在这个地方加下,大家可以根据不同情况在合适的 地方做判断处理类似情况 &nbsp; */ Log.i("CUT_PHOTO", resultCode+""); // if(resultCode==0){ // return; // } if (data != null) { setPicToView(data); } break; } super.onActivityResult(requestCode, resultCode, data); } } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub System.out.println("onSaveInstanceState"); outState.putString("temppath", temppath); outState.putSerializable("finalfile", finalfile); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub System.out.println("onRestoreInstanceState"); temppath=savedInstanceState.getString("temppath"); finalfile=(File) savedInstanceState.getSerializable("finalfile"); super.onRestoreInstanceState(savedInstanceState); } ```

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

Python可以这样学(第一季:Python内功修炼)

Python可以这样学(第一季:Python内功修炼)

C++语言基础视频教程

C++语言基础视频教程

Python可以这样学(第四季:数据分析与科学计算可视化)

Python可以这样学(第四季:数据分析与科学计算可视化)

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

Python数据分析与挖掘

Python数据分析与挖掘

微信小程序开发实战之番茄时钟开发

微信小程序开发实战之番茄时钟开发

软件测试2小时入门

软件测试2小时入门

相关热词 c# cad插入影像 c#设计思想 c#正则表达式 转换 c#form复制 c#写web c# 柱形图 c# wcf 服务库 c#应用程序管理器 c#数组如何赋值给数组 c#序列化应用目的博客园
立即提问