gteric 发表于 2017-2-27 12:34:44

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
  显示结果:

页: [1]
查看完整版本: android上的i-jetty (2)用Servlet显示Android设备的app列表