lizongbo at 618119.com 工作,生活,Android,前端,Linode,Ubuntu,nginx,java,apache,tomcat,Resin,mina,Hessian,XMPP,RPC

2010年12月29日

手机上常见的安装文件名后缀和mime类型

Filed under: Android,Java — 标签:, , , , , , , , , , , — lizongbo @ 00:43

手机上常见安装文件名后缀和mime类型
kjava是最通用的平台,有些手机只支持kjava,j2me的安装文件名以jar和jad结尾。
Android平台的软件后缀名是apk
例如手机QQ1.0(Android)Beta3Build0077的安装文件是:MobileQQ1.0(Android)Beta3Build0077.apk
如果安装了Java虚拟机的话,也可以安装文件名以jar和jad结尾的软件。
塞班(Symbian)的S60V3和S60v5平台支持的文件名后缀有:sis,sisx,jar,jad,wgz。
例如:手机QQ2010(S60V3)Beta4Build1186的安装文件名为:QQ2010(S60V3)Beta4Build1186.sisx
塞班(Symbian)S40平台只支持kjava因此安装文件名也是以jar和jad结尾。
塞班(Symbian)S60V2平台通常也支持kjava,也支持sis格式的安装文件,因此支持的格式一共有sis,jar,jad。
Symbian3是塞班新出的平台支持的文件名后缀有jar,jad,sisx和sis。
黑莓(BlackBerry)平台支持的文件名后缀有jar,jad,cod。
Plam webOS支持的安装文件名后缀有jar,jad,prc,ipk。
MTK平台的手机分支持java和不支持java两种情况,一般支持的安装文件名后缀有jar,jad,mrp。
斯凯平台是MTK平台上的中间件,支持的文件名后缀为:mrp
iPhone操作系统支持的按成程序文件名后缀为:pxl,ipa,deb。
Windows Mobile平台支持的文件名后缀有cab,jar,jad,exe。
例如手机QQ2008(Pocket PC)正式版 Build0093的安装文件名为:PPCQQ2008_Build093.CAB
下面是各种文件名后缀在nginx的mime.types中的配置:
text/vnd.sun.j2me.app-descriptor      jad;
application/java-archive              jar war ear;
application/x-java-archive-diff       jardiff;
application/vnd.android.package-archive apk;
application/vnd.ms-cab-compressed              cab;
application/octet-stream              bin exe dll;
application/vnd.symbian.install       sis;
x-epoc/x-sisx-app                     sisx;
application/iphone                    pxl ipa;
application/vnd.palm                  prc pdb;
application/vnd.webos.ipk             ipk;
application/vnd.rim.cod               cod;
application/mrp                       mrp;
x-nokia-widget                        wgz;
application/octet-stream              deb;

下面的一些mime是关于图片和视频的,列在这里备忘:
video/3gpp                            3gpp 3gp;
image/jpeg                            jpeg jpg;
image/png                             png;
image/gif                             gif;

相关参考链接:http://nds.nokia.com/uaprof/NN81-1r100.xml
APK文件格式说明:http://en.wikipedia.org/wiki/APK_%28file_format%29
sis文件格式:http://zh.wikipedia.org/zh/SIS_%28%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%29
jad文件格式: http://en.wikipedia.org/wiki/JAD_%28file_format%29
手机QQ下载:http://msoft.qq.com/d/mqq/

2010年12月23日

java.net.URL设置代理服务器和自定义Host头绕过DNS解析

Filed under: DNS,IP — 标签:, , , , , , , — lizongbo @ 00:34

在實際工作中,由于办公网络的限制,连接外网访问时需要指定代理,

而访问某些虚拟主机域名的服务器时,并不存在对应的dns解析记录,因此需要手工配置hosts文件来进行映射,非常麻烦。

于是根据java.net.URL的api整理了设置代理服务器和自定义Host头绕过DNS解析的方法:

代码如下:

[code]

public static void main(String[] args) throws IOException {
/**
* 下面这种方法是全局方式的设置 ,不建议使用。 System.setProperty(“proxySet”, “true”);
* System.setProperty(“proxyHost”, “proxy.lizongbo.com”);
* System.setProperty(“proxyPort”, “8080”);
*/
String urlStr = “http://about.me/lizongbo”;
urlStr = “http://about.me/lizongbo”;
HttpURLConnection httpConn = null;
StringBuilder sb = new StringBuilder();
URL url = new URL(urlStr);
String hostName = url.getHost();
// 根据配置自定义url里的ip地址
if (hostName.toLowerCase().endsWith(“.mqq.im”)) {
url = new URL(urlStr.replace(hostName, “127.0.0.1”));
}
System.out.println(url);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
“proxy.lizongbo.com”, 8080));
// 只针对当前这个连接使用http代理
httpConn = (HttpURLConnection) url.openConnection(proxy);
httpConn.setRequestMethod(“GET”);
// 手工设置Host头信息以支持虚拟主机,通过这样的方式,可以避免去手工配置/etc/hosts来绕过dns解析的麻烦,尤其是程序经常在不同服务器上运行的时候,非常实用
httpConn.setRequestProperty(“Host”, hostName);
httpConn.setConnectTimeout(5000);
httpConn.connect();
InputStream is = httpConn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
“UTF-8”));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line).append(‘\n’);
}
// 关闭连接
httpConn.disconnect();
System.out.println(sb);
}

[/code]

2010年12月20日

在Android的webview中定制js的alert,confirm和prompt对话框的方法

Filed under: Android,Java,前端开发 — 标签:, , , , , , — lizongbo @ 20:33

1.首先继承android.webkit.WebChromeClient实现MyWebChromeClient。

2.在MyWebChromeClient.java中覆盖onJsAlert,onJsConfirm,onJsPrompt三个方法。

3.在初始化Webview时设置调用webview.setWebChromeClient(new MyWebChromeClient());

4.在Webview载入的html中使用window.alert,window.confirm,window.prompt方法,系统弹出的将是自定义实现的对应对话框。

MyWebChromeClient.java的代码如下:

[code]
package com.lizongbo.mwebdev.android;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnKeyListener;
import android.graphics.Bitmap;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.EditText;

public class MyWebChromeClient extends WebChromeClient {

@Override
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
}

@Override
public boolean onCreateWindow(WebView view, boolean dialog,
boolean userGesture, Message resultMsg) {
return super.onCreateWindow(view, dialog, userGesture, resultMsg);
}

/**
* 覆盖默认的window.alert展示界面,避免title里显示为“:来自file:////”
*/
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
final AlertDialog.Builder builder = new AlertDialog.Builder(view
.getContext());
builder.setTitle(“lizongbo的Android webview测试alert对话框”).setMessage(message)
.setPositiveButton(“确定”, null);
//不需要绑定按键事件
//屏蔽keycode等于84之类的按键
builder.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode,
KeyEvent event) {
Log.v(“onJsAlert”, “keyCode==” + keyCode + “event=” + event);
return true;
}
});
//禁止响应按back键的事件
builder.setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
result.confirm();//因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。
return true;
// return super.onJsAlert(view, url, message, result);
}

@Override
public boolean onJsBeforeUnload(WebView view, String url, String message,
JsResult result) {
return super.onJsBeforeUnload(view, url, message, result);
}

/**
* 覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:////”
*/
@Override
public boolean onJsConfirm(WebView view, String url, String message,
final JsResult result) {
final AlertDialog.Builder builder = new AlertDialog.Builder(view
.getContext());
builder.setTitle(“lizongbo的Android webview测试confirm对话框”).setMessage(message)
.setPositiveButton(“确定”, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
}).setNeutralButton(“取消”, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
});
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
result.cancel();
}
});

//屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
builder.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode,
KeyEvent event) {
Log.v(“onJsConfirm”, “keyCode==” + keyCode + “event=” + event);
return true;
}
});
//禁止响应按back键的事件
//builder.setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
return true;
// return super.onJsConfirm(view, url, message, result);
}

/**
* 覆盖默认的window.prompt展示界面,避免title里显示为“:来自file:////”
* window.prompt(‘请输入您的域名地址’, ‘618119.com’);
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, final JsPromptResult result) {
final AlertDialog.Builder builder = new AlertDialog.Builder(view
.getContext());
builder.setTitle(“lizongbo的Android webview测试prompt对话框”).setMessage(message);
final EditText et = new EditText(view.getContext());
et.setSingleLine();
et.setText(defaultValue);
builder.setView(et);
builder.setPositiveButton(“确定”, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm(et.getText().toString());
}
}).setNeutralButton(“取消”, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
});

//屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
builder.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode,
KeyEvent event) {
Log.v(“onJsPrompt”, “keyCode==” + keyCode + “event=” + event);
return true;
}
});

//禁止响应按back键的事件
//builder.setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
return true;
// return super.onJsPrompt(view, url, message, defaultValue, result);
}

@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}

@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}

@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}

@Override
public void onRequestFocus(WebView view) {
super.onRequestFocus(view);
}

}
[/code]

Older Posts »

Powered by WordPress