十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
int (* Func) (T *list);
创新互联专注于桂东网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供桂东营销型网站建设,桂东网站制作、桂东网页设计、桂东网站官网定制、微信小程序开发服务,打造桂东网络公司原创品牌,更为您提供桂东网站排名全网营销落地服务。
是声明一个指向返回类型为int、参数列表为T *list(类型为T*,即指向类型T的指针)的函数指针Func。
typedef的语法和声明类似,只不过定义了一个类型,而不是声明变量。
所以
typedef int (* CameraLibraryAbilitiesFunc) (CameraAbilitiesList *list);
意思是定义一个指向——返回值为int类型、参数列表为CameraAbilitiesList *list的这类函数——的指针变量类型。
也就是说,这之后用CameraLibraryAbilitiesFunc f;就可以表示f指向这样一种函数了。用f=func(某个已经定义的这样类型的函数名),再用f(List)就相当于调用Func(List)了(也可以用(*f)(List),不过标准中似乎表示只是为了兼容性保留的特性,不推荐这样用)。函数指针可以重复赋值指向不同的函数(类型和参数列表要一致),这样可以带来一些方便。
整段程序应该是C++内嵌C代码,声明了一些照相机驱动用的函数类型(设备ID、错误信息之类)的名称。
----
[原创回答团]
C语言本身是无法直接控制外设的。但可以通过各种应用编程接口(api),间接调用外部设备。例如opencv库。OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#,Ch, Ruby的支持。
例程:pre t="code" l="cpp"#include "cv.h"
#include "highgui.h"
int main(int argc, char** argv) {
cvNamedWindow("win");
CvCapture* capture = cvCreateCameraCapture(0); //创建并获取摄像设备
IplImage* frame;
while(1) {
frame = cvQueryFrame(capture); //创建并获取一张摄像截图
if(!frame) break; //如果失败终止循环
cvShowImage("win", frame); //在一个"win"窗口,并当中显示该截图
char c = cvWaitKey(50);
if(c==27) break;
}
cvReleaseCapture(capture); //释放摄像设备
cvDestroyWindow("win"); //释放窗口"win"
return 0;
}/ol
android 中实现网页调用摄像头功能方法·如下:
1/apk/res/android"
xmlns:tools="schemas/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".CameraWebviewActivity"
Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Camera"
android:layout_alignParentTop="true"
/
WebView
android:id="@+id/wv"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@+id/bt"
/
/RelativeLayout
4.、编写activity:
public class CameraWebviewActivity extends Activity {
private final static String TAG = "CameraWebviewActivity";
private Button bt;
private WebView wv;
public String fileFullName;//照相后的照片的全整路径
private boolean fromTakePhoto; //是否是从摄像界面返回的webview
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_webview);
initViews();
}
private void initViews() {
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("----------------");
takePhoto( Math.random()*1000+1 + ".jpg");
}
});
wv = (WebView) findViewById(R.id.wv);
WebSettings setting = wv.getSettings();
setting.setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
wv.setWebChromeClient(new WebChromeClient(){
@Override//实现js中的alert弹窗在Activity中显示
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(TAG, message);
result.confirm();
return true;
}
});
wv.loadUrl("");
final Handler mHandler = new Handler();
//webview增加javascript接口,监听html页面中的js点击事件
wv.addJavascriptInterface(new Object(){
public String clickOnAndroid() {//将被js调用
mHandler.post(new Runnable() {
public void run() {
fromTakePhoto = true;
//调用 启用摄像头的自定义方法
takePhoto("testimg" + Math.random()*1000+1 + ".jpg");
System.out.println("========fileFullName: " + fileFullName);
}
});
return fileFullName;
}
}, "demo");
}
/*
* 调用摄像头的方法
*/
public void takePhoto(String filename) {
System.out.println("----start to take photo2 ----");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_MEDIA_TITLE, "TakePhoto");
//判断是否有SD卡
String sdDir = null;
boolean isSDcardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(isSDcardExist) {
sdDir = Environment.getExternalStorageDirectory().getAbsolutePath();
} else {
sdDir = Environment.getRootDirectory().getAbsolutePath();
}
//确定相片保存路径
String targetDir = sdDir + "/" + "webview_camera";
File file = new File(targetDir);
if (!file.exists()) {
file.mkdirs();
}
fileFullName = targetDir + "/" + filename;
System.out.println("----taking photo fileFullName: " + fileFullName);
//初始化并调用摄像头
intent.putExtra(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(fileFullName)));
startActivityForResult(intent, 1);
}
/*
* (non-Javadoc)
* @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
* 重写些方法,判断是否从摄像Activity返回的webview activity
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("----requestCode: " + requestCode + "; resultCode " + resultCode + "; fileFullName: " + fileFullName);
if (fromTakePhoto requestCode ==1 resultCode ==-1) {
wv.loadUrl("javascript:wave2('" + fileFullName + "')");
} else {
wv.loadUrl("javascript:wave2('Please take your photo')");
}
fromTakePhoto = false;
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.camera_webview, menu);
return true;
}
}