android上的i-jetty (2)用Servlet显示Android设备的app列表
环境 : android + i-jetty + servletMyServlet.java
package com.synnex.servlet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.util.Log;
public class MyServlet extends HttpServlet
{
private static final long serialVersionUID = -4258280559794945071L;
private final String TAG = "MyServlet";
private final String METHOD = "method";
private Context context;
public void init(ServletConfig config) throws ServletException
{
super.init(config);
context = (Context)config.getServletContext().getAttribute("org.mortbay.ijetty.context");
Log.v(TAG, "## init android context success ##");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String method = request.getParameter(METHOD);
if("listApp".equals(method))
{
response.setContentType("text/html; charset=UTF-8");
listApp(request, response);
}
else if("appIcon".equals(method))
{
appIcon(request, response);
}
else
{
response.setContentType("text/html; charset=UTF-8");
sayHello(request, response);
}
}
private void appIcon(HttpServletRequest request, HttpServletResponse response) throws IOException
{
response.setContentType("image/JPEG");
ServletOutputStream out = response.getOutputStream();
PackageManager pm = context.getPackageManager();
try
{
Drawable icon = pm.getApplicationIcon(request.getParameter("id"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
drawableToBitmap(icon).compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
out.write(b);
out.flush();
}
catch (NameNotFoundException e)
{
Log.e(TAG, "get app icon error : ", e);
out.write("error".getBytes("UTF-8"));
}
response.flushBuffer();
}
private void sayHello(HttpServletRequest request, HttpServletResponse response) throws IOException
{
PrintWriter writer = response.getWriter();
writer.write("Hello World!!!");
writer.flush();
response.flushBuffer();
}
private void listApp(HttpServletRequest request, HttpServletResponse response) throws IOException
{
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = context.getPackageManager().queryIntentActivities(mainIntent, 0);
PackageManager pm = context.getPackageManager();
StringBuilder buf = new StringBuilder(500);
buf.append("<table>")
.append("<tr>")
.append("<th>App Name</th>")
.append("<th>App Version</th>")
.append("<th>Package Name</th>")
.append("<th>App Icon</th>")
.append("</tr>");
String imgBaseUrl = request.getContextPath() + request.getServletPath() + "?" + METHOD + "=appIcon";
Log.v(TAG, imgBaseUrl);
for(ResolveInfo info : apps)
{
try
{
PackageInfo appInfo = pm.getPackageInfo(info.activityInfo.packageName, 0);
if((appInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)
{
buf.append("<tr>")
.append("<td>").append(appInfo.applicationInfo.loadLabel(pm)).append("</td>")
.append("<td>").append(appInfo.versionName).append("</td>")
.append("<td>").append(appInfo.packageName).append("</td>")
.append("<td><img width='50px' height='50px' src='").append(imgBaseUrl).append("&id=").append(appInfo.packageName).append("'/></td>")
.append("<td></td>")
.append("</tr>");
}
}
catch (NameNotFoundException e)
{
Log.e(TAG, "get app info error: ", e);
continue;
}
}
buf.append("</table>");
PrintWriter writer = response.getWriter();
writer.write(buf.toString());
writer.flush();
response.flushBuffer();
}
private static Bitmap drawableToBitmap(Drawable drawable)
{
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(canvas);
return bitmap;
}
} 在浏览器中输入:http://{android_ip}:8080/MyServlet?method=listApp
显示结果:
页:
[1]