2016-11-07 3 views
0

Я пытаюсь запустить представление installn после загрузки последней версии моего приложения, но приложение всегда сбой, когда ttring запускает новое действие.Запустите окно установки приложения


Это мой Broadcast приемник

**private BroadcastReceiver downloadReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //check if the broadcast message is for our Enqueued download 
     long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
     if (downloadReference == referenceId) { 
      Log.v(LOG_TAG, "Downloading of the new app version complete"); 
      //start the installation of the latest version 
      Intent installIntent = new Intent(Intent.ACTION_VIEW); 
      installIntent.setDataAndType(downloadManager.getUriForDownloadedFile(downloadReference), "application/vnd.android.package-archive"); 
      installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(installIntent); 
     } 
    } 
};** 

Это мой LogCat

Process: com.astech.android.webxbettingsystem, PID: 17476 
       java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.astech.android.webxbettingsystem (has extras) } in com.astech[email protected]1282c32 
        at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:932) 
        at android.os.Handler.handleCallback(Handler.java:815) 
        at android.os.Handler.dispatchMessage(Handler.java:104) 
        at android.os.Looper.loop(Looper.java:207) 
        at android.app.ActivityThread.main(ActivityThread.java:5737) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
       Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://downloads/my_downloads/572 typ=application/vnd.android.package-archive flg=0x10000000 } 
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809) 
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523) 
        at android.app.Activity.startActivityForResult(Activity.java:3968) 
        at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
        at android.app.Activity.startActivityForResult(Activity.java:3920) 
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:856) 
        at android.app.Activity.startActivity(Activity.java:4259) 
        at android.app.Activity.startActivity(Activity.java:4227) 
        at com.astech.android.webxbettingsystem.ui.activity.CheckAppUpdateActivity$1.onReceive(CheckAppUpdateActivity.java:55) 
        at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:922) 
        at android.os.Handler.handleCallback(Handler.java:815)  
        at android.os.Handler.dispatchMessage(Handler.java:104)  
        at android.os.Looper.loop(Looper.java:207)  
        at android.app.ActivityThread.main(ActivityThread.java:5737)  
        at java.lang.reflect.Method.invoke(Native Method)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)  

Кто-то помогает мне, пожалуйста

+0

чек, если вы добавили 'CheckAppUpdateActivity' на вашем' AndroidManifest.xml' – hrskrs

+0

Да у меня есть ** ChecAppUpdateActivity ** в мой * AndroidManifest.xml ** –

ответ

1

вы можете попытаться изменить путь вы передаете в Uri из. скачанный APK. Попробуйте использовать столбец COLUMN_LOCAL_FILENAME, который содержит локальный путь загруженного файла, чтобы сделать Uri из этого.

Вы код будет выглядеть примерно так:

@Override 
public void onReceive(Context context, Intent intent) { 
    long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 


    if (downloadReference == referenceId) { 
     DownloadManager.Query query = new DownloadManager.Query(); 
     query.setFilterById(downloadReference); 
     Cursor cursor = (DownloadManager) getSystemService(Context.DOWNLOAD_MANAGER).query(query); 


     if (cursor.moveToFirst() 
       && cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) 
         == DownloadManager.STATUS_SUCCESSFUL) { 
      String filePath cursor.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); 


      Log.v(LOG_TAG, "Downloading of the new app version complete"); 
      //start the installation of the latest version 
      Intent installIntent = new Intent(Intent.ACTION_VIEW); 
      installIntent.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); 
      installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(installIntent); 
     } 


     cursor.close(); 
    } 
} 
+0

Это работает, но ** COLUMN_LOCAL_FILENAME ** устарел –

+0

Вы можете попробовать, что Google предлагает использовать здесь: https://developer.android.com/reference /android/app/DownloadManager.html#COLUMN_LOCAL_FILENAME, я лично его никогда не использовал. –

0

Нет активности, которая может обрабатывать намерение. Используйте intent-filter в manifest для вашего-х activity

<intent-filter> 
      <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <category android:name="android.intent.category.BROWSABLE"/> 

      <data 
       android:host="your-link.com" 
       android:scheme="http"/> 
     </intent-filter> 
+0

пожалуйста, объясните мне свой код –

+0

Вам необходимо установить фильтр намерений для активности при использовании ACTION_VIEW. –

0

intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); . когда ваше начало новой деятельности, если не начинается с деятельности, intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK»нужен

У вас есть два Intent фильтры, вам нужно только один Если вы регистрируете BroadcastReceiver через. registerReceiver(), использовать только IntentFilter, который является вторым параметром этого API вызова - также не поместить элемент в манифесте

+0

i use ** registerReceiver() ** –

+0

Здесь я зарегистрирую его '' '' IntentFilter filter = new IntentFilter (DownloadManager.ACTION_DOWNLOAD_COMPLETE); registerReceiver (downloadReceiver, filter); –

+0

, тогда используйте второй параметр как фильтр намерения, который находится в вашем регистре. Получатель – Raju