使用android.hardware.Camera,为了使摄像机输出适当地跟踪设备运动,我们需要连接OrientationEventListener到setDisplayOrientation()方法Camera.这样,当用户扭转设备时,我们可以保持相机预览中的"向上"与现实世界中的"向上"同步.对于围绕Y轴旋转设备(即,从横向翻转到反向横向或向后),尤其如此.
对于大多数方向更改,android.hardware.camera2API似乎"正常工作".但是,对于Y轴旋转(横向 - >反向横向或反向横向),相机预览会被反转.
什么是调用相当于setDisplayOrientation()上Camera了Camera2 API,所以我们可以处理这种情况?
我从LogCat收到这些错误:
10-30 00:31:51.494: D/CameraHal(1205): CameraHal setOverlay/1/00000000/00000000
10-30 00:31:51.494: E/CameraHal(1205): Trying to set overlay, but overlay is null!, line:3472
10-30 00:31:51.494: W/CameraService(1205): Overlay create failed - retrying
...
10-30 00:31:52.526: E/CameraService(1205): Overlay Creation Failed!
...
10-30 00:31:52.588: E/AndroidRuntime(5040): FATAL EXCEPTION: main
10-30 00:31:52.588: E/AndroidRuntime(5040): java.lang.RuntimeException: startPreview failed
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.hardware.Camera.startPreview(Native Method)
10-30 00:31:52.588: E/AndroidRuntime(5040): at com.matthewmitchell.nightcam.CameraSurfaceView.surfaceCreated(CameraSurfaceView.java:47)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.SurfaceView.updateWindow(SurfaceView.java:544)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:341)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
10-30 00:31:52.588: E/AndroidRuntime(5040): …Run Code Online (Sandbox Code Playgroud) 此应用程序中的WebView打开一个带有上传按钮的页面.

下面是允许打开对话框以从库或相机上传图像的代码块.
在我的活动中我有:
private WebView wv;
//make HTML upload button work in Webview
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode==FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Uri result = intent == null || resultCode != RESULT_OK ? null
: intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
Run Code Online (Sandbox Code Playgroud)
在onCreate中我有以下内容:
wv.setWebChromeClient(new WebChromeClient() {
private Uri imageUri;
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType ) {
File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
// …Run Code Online (Sandbox Code Playgroud) android android-intent android-image android-webview android-camera
嗨我ACTION_IMAGE_CAPTURE用于捕获图像使用Intent如下:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(
MediaStore.EXTRA_OUTPUT, (new File(Environment.getExternalStorageDirectory(),
String.valueOf(System.currentTimeMillis()) + ".jpg"))
);
startActivityForResult(cameraIntent, 0);
Run Code Online (Sandbox Code Playgroud)
我需要将图像存储在SD卡中,并使用该onActivityResult方法检索该图像的路径.我不知道如何获取当前捕获图像的图像路径.
如果有人知道请帮助.
谢谢
我知道这个问题之前已被问过很多次了.一年多前我曾找过它,但没有找到任何东西,所以如果有任何新的想法/方法或黑客,再次发布这个问题.
我希望能够在Android设备中捕获来自两个摄像头(正面和背面)的视频.
我现在唯一想到的是每隔0.1秒如何在正面和背面之间切换,但是我从来没有能够编码.请给我任何人的帮助.
另一个想法是 - 视频通常以每秒15或30帧的速度捕获.假设它是每秒30帧.如果有一种方法可以将这些帧交替到正面和背面,那么我们可以在前面每秒15帧,在后面视频每秒15帧.这可能吗?如果是,那怎么样?请建议.音频怎么了?也许我们可以将音频限制为只有一个视频录制(正面或背面).
我有两个不同的代码库有同样的问题.
第一个是直接从developer.android.com复制的代码: http ://developer.android.com/guide/topics/media/camera.html#custom-camera
第二个是这段代码:
http://android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html
两者都可以正常使用后置摄像头,但是一旦我尝试使用前置摄像头,我就会收到错误信息.
这发生在以下设备上:
Nexus S 4.1.2
Galaxy Nexus 4.1.2
Nexus 7 4.2.1(它只有前置摄像头)
我已经尝试了看起来像2.2时代的Camera Params,有些人声称需要一些三星和HTC设备,尽管有多篇不同的文章引用了不同的字符串键:
c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance
Camera.Parameters params = c.getParameters();
params.set("cam-mode", 1);
params.set("cam_mode", 1);
params.set("camera-id", 1);
c.setParameters(params);
Run Code Online (Sandbox Code Playgroud)
这些都不起作用,请注意我正在检测Nexus 7上正确的前置摄像头ID:0.但是所有设备的结果都是一样的.
我尝试使用低质量的配置文件,我尝试过多种方式手动设置视频分辨率,编码器,输出格式,比特率,帧速率和视频大小,但没有一个有效.
让我觉得大多数代码没有错的事情是普通相机工作正常.所以我的猜测是它与设置媒体记录器的prepareVideoRecorder()/ prepareMediaRecorder()方法有关.
也许Media Recorder手动编码已知可在前置摄像头上工作的设置?
我不得不说,Android Camera和MediaRecorder API很糟糕.与iOS相比,它有点混乱,更不用说一些可怕的外观参数不兼容性问题和分散的设备环境中的不同分辨率.
假设我可以在我的JB设备上运行,有没有人从经验中知道这些问题是否已通过API 15 ICS解决了?
如果它太难以支持,我会考虑不支持API 10 Gingerbread.
是否有启动摄像头的Intent,可以选择在Android上捕获图片和视频?
我已经使用MediaStore.ACTION_VIDEO_CAPTURE和MediaStore.ACTION_IMAGE_CAPTURE来捕获音频或视频,但我找不到可以在两者之间切换的Intent,就像在这个示例app中一样:

谢谢!
我正在尝试使用适用于Android的WebRTC本机代码包(即不使用WebView)在Android应用内部实现3路视频聊天.我使用node.js编写了一个信令服务器,并使用客户端应用程序内的Gottox socket.io java客户端库连接到服务器,交换SDP数据包并建立双向视频聊天连接.
但是现在我遇到的问题不仅仅是三方通话.WebRTC本机代码包附带的AppRTCDemo应用程序仅演示双向呼叫(如果第三方尝试加入房间,则返回"房间已满"消息).
根据这个答案(与Android没有特别关系),我应该通过创建多个PeerConnections来实现,因此每个聊天参与者将连接到其他2个参与者.
但是,当我创建多个PeerConnectionClient(一个包装PeerConection的Java类,它在libjingle_peerconnection_so.so中的本机端实现)时,会从库内部抛出异常,因为它们都试图与访问相机:
E/VideoCapturerAndroid(21170): startCapture failed
E/VideoCapturerAndroid(21170): java.lang.RuntimeException: Fail to connect to camera service
E/VideoCapturerAndroid(21170): at android.hardware.Camera.native_setup(Native Method)
E/VideoCapturerAndroid(21170): at android.hardware.Camera.<init>(Camera.java:548)
E/VideoCapturerAndroid(21170): at android.hardware.Camera.open(Camera.java:389)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid.startCaptureOnCameraThread(VideoCapturerAndroid.java:528)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid.access$11(VideoCapturerAndroid.java:520)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid$6.run(VideoCapturerAndroid.java:514)
E/VideoCapturerAndroid(21170): at android.os.Handler.handleCallback(Handler.java:733)
E/VideoCapturerAndroid(21170): at android.os.Handler.dispatchMessage(Handler.java:95)
E/VideoCapturerAndroid(21170): at android.os.Looper.loop(Looper.java:136)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid$CameraThread.run(VideoCapturerAndroid.java:484)
Run Code Online (Sandbox Code Playgroud)
在尝试建立连接之前初始化本地客户端时会发生这种情况,因此它与node.js,socket.io或任何信令服务器内容无关.
如何让多个PeerConnections共享相机,以便我可以将同一视频发送给多个同行?
我的一个想法是实现某种单独的相机类来取代可以在多个连接之间共享的VideoCapturerAndroid,但我甚至不确定它是否会起作用,我想知道是否有办法做3-在我开始在库内进行黑客攻击之前使用API进行调用.
是否可能,如果可能,怎么样?
更新:
我尝试在多个PeerConnectionClients之间共享一个VideoCapturerAndroid对象,仅为第一个连接创建它,并将其传递给后续的初始化函数,但这导致了"Capturer只能被捕获一次!" 从VideoCapturer对象为第二个对等连接创建第二个VideoTrack时出现异常:
E/AndroidRuntime(18956): FATAL EXCEPTION: Thread-1397
E/AndroidRuntime(18956): java.lang.RuntimeException: Capturer can only be taken once!
E/AndroidRuntime(18956): at org.webrtc.VideoCapturer.takeNativeVideoCapturer(VideoCapturer.java:52) …Run Code Online (Sandbox Code Playgroud) 我的应用程序在Nexus5(Android6.0)中运行时出错.
错误是
java.lang.RuntimeException:无法连接到摄像头服务
我已将权限添加到AndroidManifest.xml.
但该应用程序可以使用另一部手机(Android5.1)和genymotion AVD(Android 4.0).
关键代码如下
@Override
public void onResume() {
super.onResume();
try {
mCamera = Camera.open();
}catch (Exception e){
Log.e(TAG,"open camera failed",e);
}
}
Run Code Online (Sandbox Code Playgroud) 从多窗口文档:
多窗口模式下禁用的功能
当设备处于多窗口模式时,某些功能被禁用或忽略,因为它们对于可能与其他活动或应用共享设备屏幕的活动没有意义.这些功能包括:
- 某些系统UI自定义选项已禁用; 例如,如果应用程序未以全屏模式运行,则无法隐藏状态栏.
- 系统忽略对android:screenOrientation属性的更改.
我得到了大多数应用程序,纵向和横向模式之间的区别是没有意义的,但是我正在使用SDK,其中包含用户可以进行任何活动的摄像机视图 - 包括支持多窗口模式的活动.问题是摄像机视图包含显示摄像机预览的SurfaceView/TextureView,并且为了在所有活动方向上正确显示预览,需要有关正确活动方向的知识,以便可以正确旋转摄像机预览.
问题是我的代码通过检查当前配置方向(纵向或横向)和当前屏幕旋转来计算正确的活动方向.问题是在多窗口模式下,当前配置方向不反映真实的活动方向.这会导致相机预览旋转90度,因为Android报告的配置与方向不同.
我目前的解决方法是检查所请求的活动方向并以此为基础,但有两个问题:
即使在多窗口配置中,有没有办法可以稳健地计算正确的活动方向?
这是我目前使用的代码(请参阅有问题的部分的注释):
protected int calculateHostScreenOrientation() {
int hostScreenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
int rotation = getDisplayOrientation(wm);
boolean activityInPortrait;
if ( !isInMultiWindowMode() ) {
activityInPortrait = (mConfigurationOrientation == Configuration.ORIENTATION_PORTRAIT);
} else {
// in multi-window mode configuration orientation can be landscape even if activity is actually in portrait and vice versa
// Try determining from requested orientation (not entirely correct, …Run Code Online (Sandbox Code Playgroud) camera android multi-window android-camera android-7.0-nougat
android ×10
android-camera ×10
camera ×3
java ×3
multi-window ×1
surfaceview ×1
video ×1
videochat ×1
webrtc ×1