2014年7月1日 星期二

Android 顯示已安裝的軟體

自從看到手機可能有間諜軟體後,

便好奇 app store 上的軟體為何可以偵測出應用程式是否為間諜

我猜, 無非就是例出所有已安裝的應用程式 package,

並查出它們的使用到了那些權限 (Permissions)

再交由使用者決定是否要砍殺這個 package

其中應可以再列出 service 來判斷是否為間諜


  • 一、列出已安裝軟體
http://www.androidsnippets.com/get-installed-applications-with-name-package-name-version-and-icon

chris 示範了如何列出已安裝軟體, 利用 PackageManager().getInstalledPackages() 來完成. 其中還可分別是否為系統 package.

boolean issys = (p.applicationInfo.flags & p.applicationInfo.FLAG_SYSTEM) > 0;
  • 二、Layout
RelativeLayout
         scrollView1 (ScrollView 下只可以有一個 child view)
               linearLayout1 (垂直)
                     linearLayout   (水平 , 程式動態加入)
                             ImageView  (應用程式圖片, 程式動態加入)
                             TextView (應用程式名, 程式動態加入)


  • 三、程式
  1. ScrollView 下只可以有一個 child view.
  2. Fragment 在 onStart 時, 加入程式動態加入的元件


@Override
public void onStart ()
{
super.onStart();
Log.v("app", "PlaceholderFragment::onStart");
Log.v("app", "getView():" +getView());
//TextView tv = (TextView)getView().findViewById(R.id.textView2);
//Log.v("app", "textview :" + tv);
ArrayList<PInfo> apps = ArcAndroidTool.getPackages(this.getActivity(), true);
//linearLayout1.
LinearLayout ll1 = (LinearLayout)getView().findViewById(R.id.linearLayout1);
Log.v("app", "LinearLayout1 :" + ll1);
final int max = apps.size();
for (int i=0; i<max; i++)
   {
//linearlayout.
LinearLayout ll = new LinearLayout(getActivity());
//icon.
ImageView iv = new ImageView(getActivity());
iv.setImageDrawable(apps.get(i).icon);
ll.addView(iv);
//package name.
TextView tv = new TextView(getActivity());
tv.setText(apps.get(i).appname);
ll.addView(tv);
//水平.
ll1.addView(ll,  new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

       }        
}