2016-11-07 126 views
0

我试图在下载最新版本的应用程序后启动安装视图,但应用程序始终会在ttring启动新活动时崩溃。启动应用程序安装视图


这是我的广播接收器

**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

检查,如果你已经在我的* AndroidManifest.xml中** – hrskrs

+0

是的,我有** ** ChecAppUpdateActivity请向我解释您的代码 –

回答

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

您可以尝试谷歌建议在这里使用的建议:https://developer.android.com/reference /android/app/DownloadManager.html#COLUMN_LOCAL_FILENAME,我个人从未使用过它。 –

0

没有活动可以处理的意图。使用在manifestintent-filter您的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

接着说:CheckAppUpdateActivity'您'AndroidManifest.xml' –

+0

使用ACTION_VIEW时,您需要为活动设置意图过滤器。 –

0

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 。当你开始一个新的活动,如果无法从活动开始,需要 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK”

你有两个意图过滤器,你只需要一个,如果你通过注册的广播接收器。 registerReceiver(),只使用IntentFilter的,其对API调用的第二个参数 - 不要也把一个元素在清单中的

+0

我使用** registerReceiver()** –

+0

这是我注册的地方 '''' IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); registerReceiver(downloadReceiver,filter); –

+0

然后使用第二个参数作为您的registerReceiver中的intent过滤器 – Raju

相关问题