ソースを参照

添加读取已经安装应用的安装包信息的测试

zengjiebin 7 年 前
コミット
3416cbd0a3

+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -493,6 +493,8 @@
             android:screenOrientation="portrait"/>
         <activity android:name="com.sheep.gamegroup.view.activity.ActNewAboutUs"
             android:screenOrientation="portrait"/>
+        <activity android:name="com.sheep.gamegroup.view.activity.ActInstallApkList"
+            android:screenOrientation="portrait"/>
     </application>
 
 

+ 1 - 1
app/src/main/java/com/kfzs/duanduan/fragment/FgtSmallSheep.java

@@ -464,7 +464,7 @@ public class FgtSmallSheep extends BaseCompatFragment implements SmallSheepContr
                 Jump2View.getInstance().tryGoWxfz(activity,null);
                 break;
             case R.id.icon_layout://
-                if(BuildConfig.DEBUG) {
+                if(TestUtil.isTest()) {
                     TestUtil.test(getActivity());
                 }else
                     Jump2View.getInstance().goPersonnalCenterView(activity, null);

+ 83 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/AppInfo.java

@@ -0,0 +1,83 @@
+package com.sheep.gamegroup.model.entity;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * Created by realicing on 2018/6/19.
+ * realicing@sina.com
+ */
+public class AppInfo {
+
+    //应用图标
+    private Drawable icon;
+    //应用的名字
+    private String appName;
+    //应用程序的大小
+    private String apkSize;
+    //应用程序的安装包路径
+    private String sourceDir;
+    //表示用户程序
+    private boolean isUserApp;
+
+    //存储的位置.
+    private boolean isSD;
+
+
+    private String packageName;
+
+    public String getPackageName() {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName) {
+        this.packageName = packageName;
+    }
+
+    public Drawable getIcon() {
+        return icon;
+    }
+
+    public void setIcon(Drawable icon) {
+        this.icon = icon;
+    }
+
+    public String getAppName() {
+        return appName;
+    }
+
+    public void setAppName(String appName) {
+        this.appName = appName;
+    }
+
+    public String getApkSize() {
+        return apkSize;
+    }
+
+    public void setApkSize(String apkSize) {
+        this.apkSize = apkSize;
+    }
+
+    public boolean isUserApp() {
+        return isUserApp;
+    }
+
+    public void setUserApp(boolean isUserApp) {
+        this.isUserApp = isUserApp;
+    }
+
+    public boolean isSD() {
+        return isSD;
+    }
+
+    public void setSD(boolean isSD) {
+        this.isSD = isSD;
+    }
+
+    public String getSourceDir() {
+        return sourceDir;
+    }
+
+    public void setSourceDir(String sourceDir) {
+        this.sourceDir = sourceDir;
+    }
+}

+ 1 - 4
app/src/main/java/com/sheep/gamegroup/util/LogUtil.java

@@ -1,15 +1,12 @@
 package com.sheep.gamegroup.util;
 
-import com.sheep.jiuyan.samllsheep.BuildConfig;
-import com.sheep.jiuyan.samllsheep.SheepApp;
-
 /**
  * Created by realicing on 2018/5/12.
  * realicing@sina.com
  */
 public class LogUtil {
     public static void println(Object... msgs) {
-        if(BuildConfig.DEBUG || SheepApp.getInstance().connectAddress != ConnectAddress.sheep) {
+        if(TestUtil.isTest()) {
             for (int i = 0; i < msgs.length; i++) {
                 if(i != 0) {
                     System.out.print(" ");

+ 57 - 0
app/src/main/java/com/sheep/gamegroup/util/SysAppUtil.java

@@ -1,14 +1,21 @@
 package com.sheep.gamegroup.util;
 
 import android.app.Activity;
+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.graphics.drawable.Drawable;
 import android.os.Build;
 import android.provider.AlarmClock;
 import android.text.TextUtils;
+import android.text.format.Formatter;
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
 import com.kfzs.duanduan.utils.ApkUtils;
+import com.sheep.gamegroup.model.entity.AppInfo;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.utils.ClassFileHelper;
@@ -18,6 +25,7 @@ import java.io.File;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.List;
 
 import rx.Observable;
 import rx.android.schedulers.AndroidSchedulers;
@@ -220,4 +228,53 @@ public class SysAppUtil {
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(action1);
     }
+
+    public static List<AppInfo> getAppInfos(){
+        //首先获取到包的管理者
+        PackageManager packageManager = SheepApp.getInstance().getPackageManager();
+        //获取到所有的安装包
+        List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
+        ArrayList<AppInfo> appInfos = new ArrayList<>();
+        for (PackageInfo installedPackage : installedPackages) {
+            AppInfo appInfo = new AppInfo();
+            //程序包名
+            String packageName = installedPackage.packageName;
+            appInfo.setPackageName(packageName);
+            //获取到图标
+            Drawable icon = installedPackage.applicationInfo.loadIcon(packageManager);
+            appInfo.setIcon(icon);
+            //获取到应用的名字
+            String appName = installedPackage.applicationInfo.loadLabel(packageManager).toString();
+            appInfo.setAppName(appName);
+            //获取到安装包的路径
+            String sourceDir = installedPackage.applicationInfo.sourceDir;
+            appInfo.setSourceDir(sourceDir);
+            File file = new File(sourceDir);
+            //获取到安装apk的大小
+            long apkSize = file.length();
+            //格式化apk的大小
+            appInfo.setApkSize(Formatter.formatFileSize(SheepApp.getInstance(),apkSize));
+
+            int flags = installedPackage.applicationInfo.flags;
+            //判断当前是否是系统app
+            if((flags & ApplicationInfo.FLAG_SYSTEM) !=0){
+                //那么就是系统app
+                appInfo.setUserApp(false);
+            }else{
+                //那么就是用户app
+                appInfo.setUserApp(true);
+            }
+
+            if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE)!=0){
+                //那么当前安装的就是sd卡
+                appInfo.setSD(true);
+
+            }else{
+                //那么就是手机内存
+                appInfo.setSD(false);
+            }
+            appInfos.add(appInfo);
+        }
+        return appInfos;
+    }
 }

+ 10 - 4
app/src/main/java/com/sheep/gamegroup/util/TestUtil.java

@@ -25,6 +25,7 @@ import com.sheep.gamegroup.model.entity.LoginUser;
 import com.sheep.gamegroup.model.entity.TaskEty;
 import com.sheep.gamegroup.model.entity.UserEntity;
 import com.sheep.gamegroup.model.util.SheepSubscriber;
+import com.sheep.gamegroup.view.activity.ActInstallApkList;
 import com.sheep.jiuyan.samllsheep.BuildConfig;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.SheepApp;
@@ -269,15 +270,15 @@ public class TestUtil {
      * @param activity
      */
     public static void test(final Activity activity) {
-        G.showToast("这个不是bug,正式版本不会出现该对话框!");
-        final String[] items = {"测试跳转系统设置","启动辅助","任务游戏列表","世界杯活动","交通银行信用卡测试", "浦发银行信用卡测试", "测试游戏模块","打卡成功提示","定向货币详情","提交身份认证时的提示", "检查标签", "友盟分享"};
-        AlertDialog dialog = new AlertDialog.Builder(activity).setTitle("请选择要测试的信用卡")
+        final String[] items = {"显示已经安装应用列表","启动辅助","任务游戏列表","世界杯活动","交通银行信用卡测试", "浦发银行信用卡测试", "测试游戏模块","打卡成功提示","定向货币详情","提交身份认证时的提示", "检查标签", "友盟分享"};
+        AlertDialog dialog = new AlertDialog.Builder(activity).setTitle("请选择测试项目")
                 .setItems(items, new DialogInterface.OnClickListener() {
 
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         switch (items[which]) {
-                            case "测试跳转系统设置":
+                            case "显示已经安装应用列表":
+                                showHasInstallApkList(activity);
                                 break;
                             case "启动辅助":
                                 Intent intent2 = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
@@ -347,6 +348,11 @@ public class TestUtil {
         dialog.show();
     }
 
+    private static void showHasInstallApkList(Activity activity) {
+        Intent intent = new Intent(activity, ActInstallApkList.class);
+        activity.startActivity(intent);
+    }
+
     /**
      * umen 分享
      */

+ 160 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/ActInstallApkList.java

@@ -0,0 +1,160 @@
+package com.sheep.gamegroup.view.activity;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.kfzs.android.view.tag.FlowLayout;
+import com.kfzs.android.view.tag.TagAdapter;
+import com.kfzs.android.view.tag.TagFlowLayout;
+import com.sheep.gamegroup.absBase.BaseActivity;
+import com.sheep.gamegroup.model.entity.AppInfo;
+import com.sheep.gamegroup.model.entity.DialogConfig;
+import com.sheep.gamegroup.model.entity.UserLabel;
+import com.sheep.gamegroup.model.entity.UserLabelList;
+import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.util.LogUtil;
+import com.sheep.gamegroup.util.SysAppUtil;
+import com.sheep.gamegroup.util.ViewHolder;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.view.adapter.AdbCommonRecycler;
+import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.SheepApp;
+import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import butterknife.BindView;
+import butterknife.OnClick;
+
+/**
+ * Created by realicing on 2018/6/19.
+ * realicing@sina.com
+ */
+public class ActInstallApkList extends BaseActivity {
+    @Override
+    protected int getLayoutId() {
+        return R.layout.act_user_label_list;
+    }
+
+
+    @BindView(R.id.user_label_list)
+    RecyclerView user_label_list;
+
+    @BindView(R.id.user_label_commit_tv)
+    TextView user_label_commit_tv;
+
+    @Override
+    public void initView() {
+        TitleBarUtils
+                .getInstance()
+                .setTitle(this, "已经安装的应用列表")
+                .setTitleFinish(this);
+        user_label_commit_tv.setVisibility(View.GONE);
+    }
+
+    @Override
+    public void initListener() {
+
+    }
+
+    @Override
+    public void initData() {
+        loadData(SysAppUtil.getAppInfos());
+    }
+    private List<AppInfo> appInfoList;
+    private void loadData(List<AppInfo> appInfoList) {
+        this.appInfoList = appInfoList;
+        user_label_list.setLayoutManager(new LinearLayoutManager(SheepApp.getInstance()));
+        user_label_list.setAdapter(new AdbCommonRecycler<AppInfo>(SheepApp.getInstance(), appInfoList){
+
+            @Override
+            public int getViewIdByType(int type) {
+                return R.layout.app_info_item;
+            }
+
+            @Override
+            public void convert(ViewHolder holder, final AppInfo appInfo) {
+                ImageView app_info_iv = (ImageView)holder.itemView.findViewById(R.id.app_info_iv);
+                TextView app_info_name_tv = (TextView)holder.itemView.findViewById(R.id.app_info_name_tv);
+                TextView app_info_package_name_tv = (TextView)holder.itemView.findViewById(R.id.app_info_package_name_tv);
+                TextView app_info_size_tv = (TextView)holder.itemView.findViewById(R.id.app_info_size_tv);
+                TextView app_info_path_tv = (TextView)holder.itemView.findViewById(R.id.app_info_path_tv);
+                TextView app_info_is_sys_tv = (TextView)holder.itemView.findViewById(R.id.app_info_is_sys_tv);
+                TextView app_info_is_sd_tv = (TextView)holder.itemView.findViewById(R.id.app_info_is_sd_tv);
+
+                app_info_iv.setImageDrawable(appInfo.getIcon());
+                ViewUtil.setText(app_info_name_tv, appInfo.getAppName());
+                ViewUtil.setText(app_info_package_name_tv, appInfo.getPackageName());
+                ViewUtil.setText(app_info_size_tv, appInfo.getApkSize());
+                ViewUtil.setText(app_info_path_tv, appInfo.getSourceDir());
+                ViewUtil.setText(app_info_is_sys_tv, appInfo.isUserApp() ? "用户app":"系统app");
+                ViewUtil.setText(app_info_is_sd_tv, appInfo.isSD() ? "SD卡" : "手机内存");
+
+                holder.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        onClickItem(view, appInfo);
+                    }
+                });
+            }
+        });
+
+    }
+
+    private void onClickItem(View view, final AppInfo appInfo) {
+        readApp(appInfo);
+    }
+
+
+    public void readApp(AppInfo appInfo) {
+        String sourceDir = appInfo.getSourceDir();
+        ZipFile zipfile = null;
+        try {
+            zipfile = new ZipFile(sourceDir);
+            Enumeration<?> entries = zipfile.entries();
+            while (entries.hasMoreElements()) {
+                ZipEntry entry = ((ZipEntry) entries.nextElement());
+                String entryName = entry.getName();
+                if (entryName.contains("../")) {
+                    break;
+                }
+                LogUtil.println("readApp", appInfo.getAppName(), appInfo.getPackageName(), entryName);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (zipfile != null) {
+                try {
+                    zipfile.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    @OnClick({R.id.user_label_commit_tv})
+    public void onViewClicked(View view) {
+        switch (view.getId()) {
+            case R.id.user_label_commit_tv:
+                toCommit();
+                break;
+        }
+    }
+
+    private void toCommit() {
+    }
+
+}

+ 93 - 0
app/src/main/res/layout/app_info_item.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="@dimen/content_padding_10"
+    android:background="@drawable/x_shap_shadow_bg_rectgangle_white"
+    android:paddingBottom="@dimen/content_padding_10"
+    android:paddingEnd="@dimen/content_padding_20"
+    android:paddingStart="@dimen/content_padding_20"
+    android:paddingTop="@dimen/content_padding_20">
+
+    <ImageView
+        android:id="@+id/app_info_iv"
+        android:layout_width="80dp"
+        android:layout_height="80dp"
+        android:src="@mipmap/icon"
+        app:layout_constraintStart_toStartOf="parent" />
+
+    <TextView
+        android:id="@+id/app_info_name_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_marginStart="@dimen/content_padding_10"
+        android:text="名称"
+        android:textColor="@color/black_6_3"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toTopOf="@+id/app_info_size_tv"
+        app:layout_constraintStart_toEndOf="@id/app_info_iv"
+        app:layout_constraintTop_toTopOf="@+id/app_info_iv" />
+
+    <TextView
+        android:id="@+id/app_info_package_name_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:text="包名"
+        android:textColor="@color/black_191919"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toTopOf="@+id/app_info_path_tv"
+        app:layout_constraintStart_toStartOf="@+id/app_info_name_tv"
+        app:layout_constraintTop_toBottomOf="@+id/app_info_name_tv" />
+    <TextView
+        android:id="@+id/app_info_size_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:text="大小"
+        android:textColor="@color/black_191919"
+        android:textSize="15sp"
+        android:layout_marginStart="@dimen/content_padding_10"
+        app:layout_constraintBottom_toTopOf="@+id/app_info_path_tv"
+        app:layout_constraintStart_toEndOf="@+id/app_info_package_name_tv"
+        app:layout_constraintTop_toBottomOf="@+id/app_info_name_tv" />
+
+    <TextView
+        android:id="@+id/app_info_path_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:text="路径"
+        android:textColor="@color/black_deep"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toBottomOf="@+id/app_info_iv"
+        app:layout_constraintStart_toStartOf="@+id/app_info_name_tv"
+        app:layout_constraintTop_toBottomOf="@+id/app_info_size_tv" />
+
+    <TextView
+        android:id="@+id/app_info_is_sys_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:text="系统应用"
+        android:textColor="@color/black_deep"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toTopOf="@+id/app_info_is_sd_tv"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/app_info_iv" />
+
+    <TextView
+        android:id="@+id/app_info_is_sd_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:text="sd卡"
+        android:textColor="@color/black_deep"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toBottomOf="@+id/app_info_size_tv"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/app_info_is_sys_tv" />
+
+</android.support.constraint.ConstraintLayout>