2011-12-12 87 views
5

我正在嘗試創建一個應用程序,該應用程序會自動從特定服務器下載一個apk並將其安裝到系統中。我的安裝代碼如下所示,但不起作用。從另一個程序安裝apk

File f = new File("/mnt/sdcard/download/", "Demo.apk"); 
Log.i("Demo", "f "+f.getAbsoluteFile()); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package_archive"); 
intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); 
m_context.startActivity(intent);    

我需要給Manifest.xml安裝權嗎?我知道這個問題以前曾被問過,但迄今爲止,沒有任何答案對我有所幫助。

+1

正如我在我的回答中提到的,使用「package-archive」而不是「package_archive」。希望這解決了ActivityNotFoundException。 – Karthik

回答

9

這是我在我的情況下做的,

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File(path+"/<application_name>.apk")), "application/vnd.android.package-archive"); 
startActivity(intent); 

而這些權限..

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.INSTALL_PACKAGES" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+5

仍然不工作,得到這個異常:* E/AndroidRuntime(2216):java.lang.RuntimeException:無法啓動活動ComponentInfo {foo.bar/foo.bar.FooActivity}:android.content.ActivityNotFoundException:找不到活動處理意圖{act = android.intent.action.VIEW dat = file:///mnt/sdcard/Demo.apk typ = application/vnd.android.package_archive flg = 0x10000000} * – user932865

+0

,因爲它是系統應用程序的參考。 – CoolMind

3

我也做

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

和我安裝lookd這樣

intent.setDataAndType(Uri.parse("file://"+path), "application/vnd.android.package-archive"); 

path是一個字符串,如您˚F

+0

file://保存我的日子,謝謝 – djdance

0

你需要這樣做

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); 

在代碼中,你提到「package_archive」,應該是「打包存檔」。
您需要以下權限。

<uses-permission android:name="android.permission.INSTALL_PACKAGES"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
7

感謝您的一切幫助,使它最終成功。我分享我的工作代碼並運行Manifest.xml。

package test.installer; 
import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 

public class InstallToolActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.i("Demo", "onCreate"); 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setDataAndType(Uri.parse("file://"+"/mnt/sdcard/HelloWorld.apk"), "application/vnd.android.package-archive"); 
    intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
    } 
} 

Manifext.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="test.installer" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="11" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/> 
<uses-permission android:name="android.permission.RESTART_PACKAGES"/> 


<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".InstallToolActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

//弗雷德裏克

+1

嗨Fredrik,我應該感謝你分享你的經驗。我遵循了完全相同的說明,但是我收到「PArser Error。解析軟件包時出現問題。」我嘗試過提及很多論壇,但這不是很有幫助。讚賞任何形式的幫助。 – ayachama

+0

新手,你在這個問題上有什麼進展嗎? –

+0

@Newbie您是否對這兩種軟件使用相同的簽名?你使用的是哪個Android版本? – user932865

1

如果您targetSdkVersion等於或大於24以上,那麼你需要使用FileProvider實施針對Android N和更新Android版本。

這裏是整個執行:

// utility method 
private void openAppInstaller(Context context, File toInstall) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
     Uri apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", toInstall); 
     Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); 
     intent.setData(apkUri); 
     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     context.startActivity(intent) 
    } else { 
     Uri apkUri = Uri.fromFile(toInstall); 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intent); 
    } 
} 

添加提供程序FileProviderAndroidManifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    ... 
    <application 
     ... 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="${applicationId}.provider" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/provider_paths"/> 
     </provider> 
    </application> 
</manifest> 

,創造provider_paths.xml下的XML資源。

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <external-path name="external_files" path="."/> 
</paths> 

約FileProvider配置更多信息,你可以閱讀herehere

所有積分均爲@just_user,因爲我的回答基於his reply