Intereting Posts
Как вы получаете контактную фотографию через поставщика контактов в android 2.3.6? Как избежать четких уведомлений о завершении деятельности Получение «Подключение через ADB к localhost: 5277 … не удалось» Android MediaPlayer для Android SetSurface в состоянии паузы Как перемещать текст кнопок при нажатии Ввести событие движения через окно? PCM -> AAC (Encoder) -> PCM (декодер) в режиме реального времени с правильной оптимизацией Скрыть кнопку микрофона Виртуальная клавиатура Android Как стилизовать элементы меню на панели действий Android Как удалить элемент из viewpager и pageradapter Стеки останавливаются перед тем, как перейти к моему коду (на Android с помощью NDK) Использование ProgressDialog в ActionBar (Android) Допустимые состояния с цветами (не растягиваемыми) Добавление заголовков аутентификации в NetworkImageView в Volley Получить выбранный элемент из списка ListView с помощью SimpleCursorAdapter

Как принудительно удалить приложение для обновления?

Я сделал ошибку, которая, по-видимому, может быть решена только путем удаления, а затем снова установки моего приложения.

Я передал сообщение пользователям, но, похоже, никто не удаляет его.

AFAIK, если я изменю файл сертификата, магазин воспроизведения не позволит мне загрузить приложение, и, очевидно, я не хочу загружать новое приложение.

Есть ли способ принудительно удалить для обновления?

Благодаря!

Нет никакого killswitch, чтобы дистанционно принудительно удалять (это был бы кошмар безопасности). Что вы можете сделать, это опубликовать фиксированную версию в Google Play и дождаться обновления пользователями.

Пользователи должны иметь возможность перейти в « Settings > Applications > Manage Applications и выбрать приложение для удаления. Я никогда не видел случая, когда приложение нельзя удалить таким образом, за исключением случаев, когда встроенные приложения требуют укороченного устройства для удаления.

Я не знаю, поможет ли это вам, но у меня была такая же проблема. Решение для меня заключается в том, что я проверяю версию приложения каждый раз, когда пользователь открывает его и сравнивает его с кодом версии, хранящимся на сервере apache (в файле checkversion.php). Если версии не совпадают, я показываю диалог отмены, который просит пользователя перейти на рынок и загрузить обновление.

Вот пример (имейте в виду, что я использую библиотеку Volley для обработки соединений):

  public class UpdateManager { private Activity ac; private HashMap<String,String> params; public UpdateManager(Activity ac) { this.ac = ac; } public void checkForUpdates() { Log.d("UpdateManager","checkForUpdates() - Started..."); params = new HashMap<String,String>(); params.put("request","checkforupdates"); try { params.put("versioncode", String.valueOf(ac.getPackageManager().getPackageInfo(ac.getPackageName(), 0).versionCode)); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (Helper.isInternetAvailable(ac)) { //this is a class i made to check internet connection availability checkAppVersion(); } else { Log.d("UpdateManager","CheckForUpdates(): Impossible to update version due to lack of connection"); } } private void checkAppVersion() { Log.d("UpdateManager","checkAppVersion() - Request started..."); JsonObjectRequest req = new JsonObjectRequest("http://yourserver/checkappversion.php", new JSONObject(params), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { if (response != null && response.has("result")) { try { Log.d("UpdateManager","checkAppVersion() - Request finished - Response: "+response.getString("result")); if (response.getString("result").matches("updaterequested")) { //Update requested. Show the relative dialog Log.d("UpdateManager","Update requested"); askUserForUpdate(); } else if (response.getString("result").matches("current")) { //Same version. Do nothing Log.d("UpdateManager","Version is up to date"); } else if (response.getString("result").matches("error")) { //You can return an error message if error occurred on server Log.d("UpdateManager","checkappversion Error - "+response.getString("error")); } VolleyLog.v("Response:%n %s", response.toString(4)); } catch (JSONException e) { e.printStackTrace(); } } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("UpdateManager","Volley Error - "+error.getMessage()); } }); req.setRetryPolicy(new DefaultRetryPolicy(60000,0,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); ConnectionController.getInstance().addToRequestQueue(req); } public void askUserForUpdate() { final Dialog diag = new Dialog(ac); diag.requestWindowFeature(Window.FEATURE_NO_TITLE); diag.setContentView(R.layout.updatemanager_requestupdate_dialog); diag.setCancelable(false); diag.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); TextView t = (TextView)diag.findViewById(R.id.requestupdate_dialog_main_text); ImageView im_ok = (ImageView)diag.findViewById(R.id.requestupdate_dialog_ok); ImageView im_canc = (ImageView)diag.findViewById(R.id.requestupdate_dialog_canc); t.setText(ac.getResources().getString(R.string.update_manager_askuserforupdate)); im_canc.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { diag.dismiss(); ac.finish(); } }); im_ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id="+ac.getPackageName())); diag.dismiss(); ac.startActivity(intent); ac.finish(); } }); diag.show(); } } 

Затем вы можете использовать его, когда ваше основное действие (или, возможно, активность входа) начинается следующим образом:

  UpdateManager updateManager = new UpdateManager(MainActivity.this); //i assume MainActicity as the calling activity updateManager.checkForUpdates(); 

Очевидно, что это должно быть реализовано в коде приложения, поэтому в первый раз вам приходится полагаться только на пользователя, чтобы его вручную обновить. Но это может помочь, если у вас будет такая же проблема в будущем.

Это выдержка из моего личного кода, поэтому вам нужно перестроить его в соответствии с вашими потребностями. Надеюсь, это поможет кому-то.