android上的i-jetty (2)用Servlet显示Android设备的app列表

环境 : android + i-jetty + servlet

MyServlet.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

显示结果: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值