【问题标题】:How to stop app from accessing the internet when a blacklisted app is installed安装黑名单应用时如何阻止应用访问互联网
【发布时间】:2021-11-09 07:34:00
【问题描述】:

我有一个应用程序,它会在打开时自动在线获取数据。我想使该应用程序仅在未检测到列入黑名单的应用程序时才检查在线更新。

这是更新核心。

    public class UpdateCore extends AsyncTask<String, String, String> {
        private static final String TAG = "NetGuard.Download";
    
        private Context context;
    
        private Listener listener;
        private PowerManager.WakeLock wakeLock;
    
        private HttpURLConnection uRLConnection;
    
        private InputStream is;
        private TorrentDetection torrent;
    
        private BufferedReader buffer;
    
        private String url;
    
         
        public interface Listener {
            
    
            void onLoading();
           
            void onCompleted(String config) throws Exception;
    
            void onCancelled();
    
            void onException(String ex);
        }
    
        public UpdateCore(Context context, String url, Listener listener) {
    
            this.context = context;
            this.url = url;
            this.listener = listener;
        }
    
        @Override
        protected void onPreExecute() {
    
            listener.onLoading();
    
        }
    
        @Override
        protected String doInBackground(String... args) {
            try {
                String api = url;
                if(!api.startsWith("http")){
                    api = new StringBuilder().append("http://").append(url).toString();
                }
                URL oracle = new URL(api);
                HttpClient Client = new DefaultHttpClient();
                HttpGet httpget = new HttpGet(oracle.toURI());
                HttpResponse response = Client.execute(httpget);
                InputStream in = response.getEntity().getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                                                               in, "iso-8859-1"), 8);
    
                //BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder str = new StringBuilder();
                String line = null;
                while((line = reader.readLine()) != null)
                {
                    str.append(line);
                }
                in.close();
                return str.toString();
            } catch (Exception e) {
                return "error";
            } finally {
                if (buffer != null) {
                    try {
                        buffer.close();
                    } catch (IOException ignored) {
                    }
                }
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException ignored) {
    
                    }
                }
                if (uRLConnection != null) {
                    uRLConnection.disconnect();
                }
            }
        }
    
        @Override
        protected void onCancelled() {
            super.onCancelled();
           // Log.i(TAG, "Cancelled");
           // pd.dismiss();
            listener.onCancelled();
        }
    
        @Override
        protected void onPostExecute(String result) {
            // wakeLock.release();
            //nm.cancel(1);
           // pd.dismiss();
            try
            {
                if (result.equals("error"))
                {
                    listener.onException(result);
                }
                else {
                    listener.onCompleted(result);
                }
            }
            catch (Exception e)
            {
                listener.onException(e.getMessage());
            }
        }
    
    }

这是检测代码

    public class TorrentDetection
    {
        private Context context;
        private String[] items;
        private TorrentDetection.TorrentListener listener;
        private Timer timer;
        private Handler handler;
        public interface TorrentListener {
            public void detected(ArrayList pkg);
        }
        public TorrentDetection(Context c, String[] i, TorrentListener listener) {
            context = c;
            items = i;
            this.listener = listener;
        }
        private boolean check(String uri)
        {
            PackageManager pm = context.getPackageManager();
            boolean app_installed = false;
            try
            {
                pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
                app_installed = true;
            }
            catch (PackageManager.NameNotFoundException e)
            {
                app_installed = false;
            }
            return app_installed;
        }
    
        void check() {
            ArrayList arrayList2 = new ArrayList();
            for (String pack : items)
            {
                if(check(pack)){
                    arrayList2.add(pack);
                }
            }
            if (arrayList2.size() > 0)
            {
                
                listener.detected(arrayList2);
                stop();
            }
        }
    
        public void start() {
            handler = new Handler();
            timer = new Timer();
            TimerTask doAsynchronousTask = new TimerTask() {
                @Override
                public void run()
                {
                    handler.post(new Runnable() {
                            public void run()
                            {
                                check();
                            }
                        });
                }
            };
            timer.schedule(doAsynchronousTask, 0, 3000);
        }
    
        public void stop() {
            if(timer != null){
                timer.cancel();
                timer = null;
            }
            if(handler != null){
                handler = null;
            }
        }
    }

torrent 检测代码检查是否安装了以下应用,并返回安装了不支持的应用的消息。

    public class Constraints
    {
        public static String updater = "https://pastenord.org/raw/random";
     
        public static String[] torrentList = new String[]{
        
          "com.guoshi.httpcanary",
          
          "com.adguard.android.contentblocker"};
    
    
    }

在我的 MainActivity 中,这会在使用 torrent.start() 完成在线更新之前启动检测;

    void update() {
            torrent.start();
            new UpdateCore(this, Constraints.updater, new UpdateCore.Listener() {
                    @Override
                    public void onLoading() {
    
    
                    }
    
                    @Override
                    public void onCompleted(final String config) {
                        try {
                            final JSONObject obj = new JSONObject(MilitaryGradeEncrypt.decryptBase64StringToString(config, Constraints.confpass));
                            if (Double.valueOf(obj.getString("Version")) <= Double.valueOf(conts.getConfigVersion())) {
    
                            } else {
                                new SweetAlertDialog(MainActivity.this, SweetAlertDialog.CUSTOM_IMAGE_TYPE)
                                    .setTitleText("Update")
                                    .setContentText("\n" + obj.getString("Message"))
                                    .setConfirmText("Yes,Update it!")
                                    .setCustomImage(R.drawable.ic_update)
                                    .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                                        @Override
                                        public void onClick(SweetAlertDialog sDialog) {
                                            sDialog.dismissWithAnimation();
                                            welcomeNotif();
                                            restart_app();
                                            
                                            try {
                                                db.updateData("1", config);
                                                sp.edit().putString("CurrentConfigVersion", obj.getString("Version")).commit();
                                             
                                            } catch (JSONException e) {}
                                        }
                                    })
                                    .show();
                            }
                        } catch (Exception e) {
                            // Toast.makeText(MainActivity.this, e.getMessage() , 0).show();
                        }
                    }
    
                    @Override
                    public void onCancelled() {
    
                    }
    
                    @Override
                    public void onException(String ex) {
    
                    }
                }).execute();
        }
    
    }

当检测到不支持的应用时,它会弹出一个窗口。

    torrent = new TorrentDetection(this, Constraints.torrentList, new TorrentDetection.TorrentListener() {
    @Override
    public void detected(ArrayList pkg)
    {
        stopService();
        new AlertDialog.Builder(MainActivity.this)
            .setTitle("unsupported App!")
            .setMessage(String.format("%s", new Object[]{TextUtils.join(", ", (String[]) pkg.toArray(new String[pkg.size()]))}))
            .setPositiveButton("OK", null)
            //.setAnimation(Animation.SLIDE)
            .setCancelable(false)
            .create()
            //.setIcon(R.mipmap.ic_info, Icon.Visible)
            .show();
    }
});

我希望仅在安装完列入黑名单的应用程序后,才使应用程序检查在线更新。欢迎并感谢任何形式的帮助。

【问题讨论】:

  • 你的代码不工作??还是你想要一种不同的方法???
  • @yahya-durrani 是的,代码可以工作,但我想要一种方法让应用程序仅在检测到没有安装 torrent 或嗅探应用程序后才检查在线更新。

标签: java android android-asynctask


【解决方案1】:

使用此方法检查是否安装了应用程序

public boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

然后检查,只需调用:

PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);
// simply put an if statemement
if(!isInstalled){
//do your update here
}
else{
//display you have installed a blacklisted app
}

旁注,如果您的目标是 android 11 及更高版本,您需要像这样在清单中提供有关您想要查找的软件包的信息

 <queries>
            <!--Add queries here-->
        <package android:name="com.somepackage.name" />
    </queries>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2016-05-29
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多