当前位置:首页 > Android > 正文内容

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

canca13年前 (2013-05-02)Android631
环境 : 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='http://cancait.blog.163.com/blog/").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

显示结果: 


android上的i-jetty (2)用Servlet显示Android设备的app列表 - Canca Torvals - 双手要撑得起天

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/146.html

标签: Android
分享给朋友:

“android上的i-jetty (2)用Servlet显示Android设备的app列表” 的相关文章

android上的i-jetty (1)环境搭建

android上的i-jetty (1)环境搭建

介绍下如果把android设备作为一个web服务器使用,  编译i-jetty 1. 将源码download下来,http://code.google.com/p/i-jetty/downloads/list 2. 解压文件,进入pom.xml所在目录,执行命令: mvn cle...

论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因

最近在开发中遇到一个问题,Adapter中使用notifyDataSetChanged 与notifyDataSetInvalidated无效,经过思考和网上查找,得出如下原因。首先看一下notifyDataSetChanged与notifyDataSetInvalidated的区别我们可应用粮仓来...

Android 实现文件分享功能(共享多个文件)

神一样的代码:针对image代码如下:Intentshare=newIntent(Intent.ACTION_SEND); share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));//此处一定要用Uri.fromFile(f...

Please ensure that adb is correctly located at……问题解决方案

遇到问题描述:运行android程序控制台输出    [2013-10-13 16:45:50 - ] The connection to adb is down, and a severe error has occured.    [2...

Android WebView页面加载优化

目前webapp越来越多,体验也越来越好,为了能够更好的使用WebView展示出流畅的的页面,可以从以下几点做优化:WebView缓存资源文件本地存储减少耗时操作客户端UI优化可能有人会说了,为什么不做成native的呢,这样就不用那么的麻烦了。如果我需要加载的内容都是静态的,当然做成native的...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。