当前位置:  编程技术>移动开发
本页文章导读:
    ▪[转]运用libcurl连接https服务器        [转]使用libcurl连接https服务器   http://blog.csdn.net/xinghexiyue/article/details/6324915 问题 你是否也想让自己的 iPhone 应用程序连接 https 服务器呢?下面我就介绍一下其使用方法。 通常使用 Objective.........
    ▪ 照相机Camera        相机Camera public class Main extends Activity implements SurfaceHolder.Callback, OnClickListener, PictureCallback { private Camera camera;// 相机 private boolean isboolean = true; public static final int ITEM0 = Menu.FIRST; public static fin.........
    ▪ java核心技术小结五       java核心技术总结五 第六章 1、接口 (1)、接口中可以包含多个方法,还可以定义常量。接口中绝对不能含有实例域。可以将接口看成是没有实例域的抽象类。但是接口并不等价于抽象类。 (2).........

[1][转]运用libcurl连接https服务器
    来源: 互联网  发布时间: 2014-02-18
[转]使用libcurl连接https服务器

 

http://blog.csdn.net/xinghexiyue/article/details/6324915
问题

你是否也想让自己的 iPhone 应用程序连接 https 服务器呢?下面我就介绍一下其使用方法。

通常使用 Objective-C 的 NSURLConnection 连接有证明书的 https 服务器时会出现验证错误,我们可以使用私有API — setAllowsAnyHTTPSCertificate:forHost 来解决这个问题。如果是 Cocoa 的应用程序应该是没有什么问题,但是用在 iPhone 上,很可能过不了 App Store 的审查。

所以这里我们使用 libcurl 来完成在 iphone 上连接 https 服务器。

准备 编译 openssl

连接 https 的前提是要有 OpenSSL。你可以参考 这里 来为 iPhone 编译 OpenSSL 静态库。最终得到下面两个静态库文件。

1 2
libcrypto.a libssl.a
编译 libcurl

接下来我们下载/编译 libcurl。下载展开后,按照下面配置(根据实际情况更改你的SDK目录,版本)。

1 2 3 4 5 6
./configure --prefix=$HOME/tmp/iphonelib/curl / --host=arm-apple-darwin --disable-shared --with-random=/dev/urandom /CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc / CFLAGS="-arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -I$HOME/tmp/iphonelib/openssl/include -L$HOME/tmp/iphonelib/openssl/lib" /CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp /AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar

如果最后输出下面的内容,说明可以编译支持 https 的 libcurl 了。

1
SSL support: enabled (OpenSSL)

接下来

1 2
make make install

编译结果输出到 ~/tmp/iphonelib/curl/lib 下的 libcurl.a。

使用 添加到工程中

如下图所示,将编译好的静态库拖到你的工程中:

 


另外,由于 openssl 中使用了 zlib,所以还需要在工程中加入链接开关。(该库被包含在iPhone中,不需要重新编译)

如下图所示,在连接中追加 -lz。

 


最后,如下图添加编译所需的头文件路径。

 


比如,编译 libcurl 时的头文件的路径 ~/tmp/iphonelib/curl/include 。

代码例子

下来,让我们看看在程序中使用 libcurl 的例子。下面的例子在 AppDelegate.m 中实现。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#import "AppDelegate.h" #include <curl/curl.h> @implementation AppDelegate-(void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //Override point for customization after application launch [window makeKeyAndVisible]; CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://twitter.com/"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); res = curl_easy_perform(curl); if (0 != res) { fprintf(stderr, "curl error: %d/n", res); } curl_easy_cleanup(curl); } } -(void)dealloc { [window release]; [super dealloc]; } @end

编译运行,可以用调试工具得到取得的html,如下图。

 


在模拟器中使用 libcurl

上面介绍的都是在设备上运行的例子,如果要在模拟器上使用,由于处理器结构不一样,需要重新编译 openssl 和 curl 静态库。

编译的时候,只要将 SDK 的路径由 iPhoneOS.platform ⇒ iPhoneSimulator.platform,编译开关 -arch armv6 ⇒ -arch i386 就可以了。

只是编译的文件名最好和iphone上用的区别开来,如下所示:

1 2 3
libcrypto_simulator.a libssl_simulator.a libcurl_simulator.a

    
[2] 照相机Camera
    来源: 互联网  发布时间: 2014-02-18
相机Camera
public class Main extends Activity implements SurfaceHolder.Callback,
		OnClickListener, PictureCallback {
	private Camera camera;// 相机
	private boolean isboolean = true;
	public static final int ITEM0 = Menu.FIRST;
	public static final int ITEM1 = Menu.FIRST + 1;
	public static final int ITEM2 = Menu.FIRST + 2;
	byte[] data;
	SurfaceView surfaceView;
	ImageButton take_btn;// 拍照
	ImageButton tool_btn;// 工具

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindow().setFormat(PixelFormat.TRANSLUCENT);//
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.main);
		getView();// 实例化
		surfaceView.getHolder().setFixedSize(320, 240); // 设置分辨率
		surfaceView.getHolder()
				.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		surfaceView.getHolder().addCallback(this);// 回调
	}

	public void getView() {
		surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
		take_btn = (ImageButton) findViewById(R.id.shutter);
		tool_btn = (ImageButton) findViewById(R.id.finish);
		take_btn.setOnClickListener(this);
		tool_btn.setOnClickListener(this);
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.shutter:// 拍照
			camera.takePicture(null, null, this);
			break;
		case R.id.finish:// 工具
			Main.super.openOptionsMenu();// 打开菜单
			break;
		default:
			break;
		}
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		// 在界面尺寸改变时被调用,设置相机的参数(大小,格式)
		if (isboolean) {
			camera.stopPreview();
		}
		// 相机参数设置
		Camera.Parameters para = camera.getParameters();
		para.setPictureFormat(PixelFormat.JPEG);
		para.setPreviewSize(w, h);
		para.setPictureSize(640, 480);// 照片大小
		para.set("rotation", 90);
		camera.setParameters(para);
		try {
			camera.setPreviewDisplay(holder);
		} catch (IOException e) {
			e.printStackTrace();
		}
		camera.startPreview();
		isboolean = true;
	}

	public void surfaceCreated(SurfaceHolder holder) {
		// 界面创建时被调用,一般是用来,打开相机,设置预览
		camera = Camera.open();// 不能放在构造函数里,否则产生不了预览效果
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		camera.stopPreview();
		isboolean = false;
		camera.release();
	}

	private Dialog buildDialog(Context context) {
		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle("是否储存照片");
		builder.setPositiveButton("存储", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface arg0, int arg1) {
				savepicture(data);
			}
		});
		builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				camera.startPreview();
			}
		});
		return builder.create();
	};

	public Dialog onCreateDialog(int i) {
		switch (i) {
		case 1:
			return buildDialog(Main.this);
		}
		return null;
	};

	@SuppressWarnings("static-access")
	public void savepicture(byte[] _data) {
		String string = null;

		// 获取系统时间,并格式化
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		int year = calendar.get(Calendar.YEAR);
		int mounth = calendar.get(Calendar.MONTH) + 1;
		int day = calendar.get(Calendar.DATE);
		int hour = calendar.get(calendar.HOUR);
		int min = calendar.get(calendar.MINUTE);
		int secound = calendar.get(calendar.SECOND);
		// 格式一:2011-11-1 12-12-66 作为文件名
		String formateDate1 = String.valueOf(year) + "-"
				+ String.valueOf(mounth) + "-" + String.valueOf(day) + "  "
				+ String.valueOf(hour) + "-" + String.valueOf(min) + "-"
				+ String.valueOf(secound);
		// 格式二:2011年11月1日 12时12分45秒 写在照片上
		String formateDate2 = String.valueOf(year) + "年"
				+ String.valueOf(mounth) + "月" + String.valueOf(day) + "日  "
				+ String.valueOf(hour) + "时" + String.valueOf(min) + "分"
				+ String.valueOf(secound) + "秒";

		// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HHmmss");
		// String date = sdf.format(new Date());

		try {
			Bitmap bitmap = BitmapFactory.decodeByteArray(_data, 0,
					_data.length);
			Bitmap newbitmap = dateBitmap(bitmap, formateDate2);

			String photoName = formateDate1 + ".jpg";// 照片名称
			string = photoName;

			File file = new File(Utils.getSDPath(), photoName);// 创建图片文件

			FileOutputStream outStream = new FileOutputStream(file);
			newbitmap.compress(CompressFormat.JPEG, 100, outStream);
			outStream.close();
			camera.stopPreview();
			camera.startPreview();// 开始预览
		} catch (Exception e) {
		}
		Toast.makeText(Main.this, "照片存储路径:" + Utils.getSDPath() + "/" + string,
				2000).show();
	}

	// 往照片上写入日期
	private Bitmap dateBitmap(Bitmap bitmap, String date) {
		if (bitmap == null) {
			return null;
		}

		int w = bitmap.getWidth();
		int h = bitmap.getHeight();
		// 创建一个空白的bitmap
		Bitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
		Canvas canvas = new Canvas(newbitmap);
		canvas.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入src

		Paint paint = new Paint();
		paint.setStyle(Paint.Style.FILL);
		paint.setColor(Color.RED);

		paint.setTextSize(25);
		// canvas.drawText(date, 80, 50, paint);//居顶
		canvas.drawText(date, 80, 620, paint);// 居底
		canvas.save(Canvas.ALL_SAVE_FLAG);// 保存
		canvas.restore();// 存储
		return newbitmap;
	}

	public void onPictureTaken(byte[] _data, Camera camera) {
		data = _data;
		showDialog(1);// 弹出对话框,提示是否要保存图片
	}

	// Menu菜单
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, ITEM0, 0, "相册");
		menu.add(0, ITEM2, 2, "退出");
		menu.findItem(ITEM1);
		return true;
	}

	// Menu菜单点击事件
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case ITEM0:// 相册
			Intent intent = new Intent(Main.this, Album.class);
			startActivity(intent);
			break;
		case ITEM2:// 退出
			finish();
			break;
		}
		return super.onOptionsItemSelected(item);
	}

}

 


    
[3] java核心技术小结五
    来源: 互联网  发布时间: 2014-02-18
java核心技术总结五

第六章

1、接口

(1)、接口中可以包含多个方法,还可以定义常量。接口中绝对不能含有实例域。可以将接口看成是没有实例域的抽象类。但是接口并不等价于抽象类。

(2)、接口中所有的方法都自动是public类型,在实现接口时,一定要把方法声明为public。接口中的域将被自动设置为public static final.

(3)、Arrays类中的sort方法采用归并算法对数组中的元素进行排序。

2、Clone

(1)、try...catch...写法比较适合final类,否则使用throws说明符。

3、回调:java.swing包中的Timer类

4、内部类

(1)、使用内部类的原因有:

1)、内部类可以访问该类定义所在的作用域中的数据,包括私有数据

2)、内部类可以对同一个包中的其他类隐藏

3)、当想要定义一个回调函数且不想写大量代码时,使用匿名内部类比较便捷

(2)、嵌套是一种类之间的关系,而不是对象之间的关系。嵌套有2个好处:命名控制和访问控制

(3)、局部类的优势:对外界可以完全的隐藏;不仅可以访问包含它们的外部类,还可以访问局部变量,不过局部变量必须被声明为final。即局部类只能引用定义为final的局部变量。

(4)、声明在接口中的内部类自动成为static和public。

 

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3