2

限られた数のユーザーに与えられた Android デバイスに、さまざまなエンタープライズ アプリケーションをデプロイして更新する必要があります。

これらのアプリケーションは、Google Play で公開することは想定されていませんが、別のチャネルを介して配布する必要があります。

私がする必要があるのは、新しいアプリ/更新を自動的にチェックし、最初にユーザーの同意を求めることなく、新しいまたは更新された APK のインストールを自動的にトリガーする「エンタープライズ パッケージ マネージャー」アプリケーションです。

設計上、Android では、サード パーティのアプリケーションがインストール済みのアプリケーションと対話することを許可していません。また、デバイスに任意の APK を挿入できるため、ルート化された電話にはこの問題がないこともわかっています。

  • 「エンタープライズ パッケージ マネージャー」をシステム アプリケーションとしてインストールして ROM (CWM ベースでも) をクックし、suバイナリを使用しない場合 (これはまだエンタープライズ フォンです...)、そのプログラムは新しいアプリを自動的にインストールできますか?
  • 同意を求めずにアプリケーションをインストールするにはどうすればよいですか? つまり、必要に応じて、基本的なコード サンプルとアクセス許可が必要です。
  • とにかく、システムアプリはルートユーザーとして実行されますか? そう覚えてる
4

1 に答える 1

3

サーバーのどこかにあるアプリケーションを確認する場合は、24 時間ごとに更新を確認する必要があります。利用可能な更新がある場合は、更新されたバージョンのビルドがインストールされる非同期タスクに移動します。

public void checkforUpdate() {

        /* Get Last Update Time from Preferences */
        SharedPreferences prefs = getPreferences(0);
        lastUpdateTime = prefs.getLong("lastUpdateTime", 0);
        if ((lastUpdateTime + CommonString.timeCheckDuration) < System.currentTimeMillis() && System.currentTimeMillis()>lastUpdateTime) {
            // Asynch task
            new VersionCheckTask().execute();
        }
        else{
            // do nothing
        }
    }

次の場所に移動します。

private class VersionCheckTask extends AsyncTask<Void, Void, Void> {
        ProgressDialog progressDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            try {
                progressDialog = new ProgressDialog(Login.this, android.R.style.Theme_Holo_Light_Dialog);
                //progressDialog.setTitle("AppName");
                progressDialog.setMessage("Checking for updates...");
                progressDialog.setCancelable(false);
                progressDialog.setIndeterminate(true);
                progressDialog.show();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        protected Void doInBackground(Void... params) {
            /**
             *  Simulates a background job.
             */
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }

            HashMap<String, String> map = new HashMap<String, String>();
            map.put("build",CommonString.buildVersion);
            map.put("en", CommonString.en);

            responce = CommonFunction.PostRequest("updateCheck", map);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (progressDialog != null && progressDialog.isShowing())
                progressDialog.dismiss();
            if(!CommonFunction.isNetworkAvailable()){
                Toast.makeText(ClaimColonyApplication.getAppContext(), CommonString.NO_NETWORK, Toast.LENGTH_SHORT).show();
                return;
            }
            ParseUpdateResponse(responce);
            if(rCodeUpdate == 100 && ApkLink.length() >0){
                new AlertDialog.Builder(Login.this,android.R.style.Theme_Holo_Light_Dialog)
                .setIcon(R.drawable.ic_launcher)
                .setTitle("Update Available")
                .setMessage(""+UpdateMessage)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                         //User clicked OK so do some stuff 
                        new VersionCheckTaskDialog().execute();
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                         //User clicked Cancel 
                        finish();
                    }
                })
                .show();
            }else{
                if(rCodeUpdate == 100){
                    lastUpdateTime = System.currentTimeMillis();
                    SharedPreferences.Editor editor = getPreferences(0).edit();
                    editor.putLong("lastUpdateTime", lastUpdateTime);

                    editor.commit();
                }
            }
            super.onPostExecute(result);
        }
    }

    private class VersionCheckTaskDialog extends AsyncTask<Void, Void, Void> {
        ProgressDialog progressDialogUpdate;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            try {
                progressDialogUpdate = new ProgressDialog(Login.this, android.R.style.Theme_Holo_Light_Dialog);
                //progressDialog.setTitle("AppName");
                progressDialogUpdate.setMessage("Fetching updates...");
                progressDialogUpdate.setCancelable(false);
                progressDialogUpdate.setIndeterminate(true);
                progressDialogUpdate.show();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        protected Void doInBackground(Void... params) {
            /**
             *  Simulates a background job.
             */
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }

            String extStorageDirectory =    Environment.getExternalStorageDirectory().toString();
            File folder = new File(extStorageDirectory, "pdf");
            folder.mkdir();
            File file = new File(folder, "AppName."+"apk");
            try {
                    file.createNewFile();
            } catch (IOException e1) {
                    e1.printStackTrace();
            }
            /**
             * replace url to ApkLink
             */
             //DownloadFile(ApkLink, file);
             DownloadFile("URL", file);

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            if (progressDialogUpdate != null && progressDialogUpdate.isShowing())
                progressDialogUpdate.dismiss();
            if(!CommonFunction.isNetworkAvailable()){
                Toast.makeText(ClaimColonyApplication.getAppContext(), CommonString.NO_NETWORK, Toast.LENGTH_SHORT).show();
                return;
            }
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/pdf/" + "AppName.apk")), "application/vnd.android.package-archive");
                startActivity(intent);
                lastUpdateTime = System.currentTimeMillis();
                SharedPreferences.Editor editor = getPreferences(0).edit();
                editor.putLong("lastUpdateTime", lastUpdateTime);

                editor.commit();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                System.out.println("Exception in start intent for launch app-------: "+e.toString());
                e.printStackTrace();
            } 
            super.onPostExecute(result);
        }
    }

24 時間に 1 回更新を確認しています。利用可能な更新がある場合は、アプリケーションをアップグレードするためのポップアップが表示されます。それ以外の場合は、[設定] で最後の確認時間を節約できます。これにより、アプリケーションを更新してインストールできるようになり、24 時間後に次の更新を確認します。更新を確認するには、条件に取り組む必要がある場合があります。.apk ファイルの名前と URL を変更してください。

次の権限が必要です。

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

幸運を祈ります。

于 2012-12-12T09:29:38.460 に答える