前几天有一位朋友说,他们有一个需求:用户需要使用一个截图功能,他们的应用是用apache cordova开发的,html5对于这样的操作性能不是很好.希望能调用android的activity 来实现此功能.
这个需求涉及的技术
1)apache cordova技术
2)android的原生技术
3)CROP技术:此技术早已经被android收录,可以把它当作是android原生技术
其实重点就在于:cordova与activity如何通信?
下面把我的实现的结果与大家分享一下
第一:为cordova工程添加插件
添加成功后,看一下你的项目如下图,会自动增加了这些文件
第二:定义们的java插件类,定义时类要求继承自org.apache.cordova.CordovaPlugin,并且Override两个方法
1)execute:
三个参数分别为:action,args(传过来的值json数组格式),CallbackContext:回调类的引用;
2)onActivityResult:这个类就没有什么好讲的了,代码如下
package com.plugin;
import java.io.ByteArrayOutputStream;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
public class CallActivityPlugin extends CordovaPlugin {
public static final String ACTION = "call";
CallbackContext callbackContext;
/**
* 调用
*/
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
this.callbackContext=callbackContext;
if (action.equals(ACTION)) {
try {
Intent intent = new Intent().setClass(cordova.getActivity(),Class.forName(args.getString(0)));
String fromImgPath=args.getString(1);
intent.putExtra("fromImgPath", fromImgPath);
this.cordova.startActivityForResult(this, intent, 1);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
//回调
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (resultCode) {
case Activity.RESULT_OK:
Bundle extras = intent.getExtras();
Bitmap photo = extras.getParcelable("data");
System.out.println(photo);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);
byte[] b = stream.toByteArray();
String content = new String(Base64Coder.encodeLines(b));
PluginResult mPlugin = new PluginResult(PluginResult.Status.NO_RESULT);
mPlugin.setKeepCallback(true);
callbackContext.sendPluginResult(mPlugin);
callbackContext.success(content);
break;
default:
break;
}
}
}
第三:利用CROP来处理图片,在ImgPluginActivity中来实现,代码如下
package com.plugin;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
public class ImgPluginActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
Intent intent = this.getIntent();
String fromImgPath = intent.getStringExtra("fromImgPath");
Uri uri = Uri.parse(fromImgPath);
startPhotoZoom(uri);
super.onResume();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(data!= null){
setResult(Activity.RESULT_OK, data);
finish();
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
public void startPhotoZoom(Uri uri) {
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", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 1);
}
}
以上我们activity代码都已完毕!下面需要们把cordova与activity关联起来,在工程的,res/xml/config.xml将java类设为插件,如下图
接下来我们需要将配制好的插件定义为js函数
请注意:
1)"CallActivityPlugin"与config.xml的配制的保持一致
2)cordova.exec(这里的参数要与CallActivityPlugin类中的execute方法的参数对应关系)
3)"com.plugin.ImgPluginActivity"为处理业务类的全路径,在CallActivityPlugin中会以反射的方式使用它
4)echoValue:是CallbackContext这个类的回调返回值
运行一下效果吧
先首:非常感谢网上提供资料的所有朋友.
最后,我把工程代码放在了网盘上面:有用得到的朋友可以下载!
链接: http://pan.baidu.com/s/1gdAIAmJ 密码: wmt3