2011-12-12 3 views
5

Sto provando a creare un'applicazione che scarica automaticamente un apk da un server specifico e lo installa sul sistema. Il mio codice per l'installazione sembra il seguente, ma non funziona.Installa apk da un altro programma

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);    

Ho bisogno di dare alcun diritto in Manifest.xml per l'installazione? So che la domanda è stata posta prima, ma nessuna delle risposte mi ha aiutato finora.

+1

Come accennato nella mia risposta, utilizzare "pacchetto-archivio" e non "pacchetto_archivo". Spero che questo risolva l'ActivityNotFoundException. – Karthik

risposta

9

Questo quello che faccio nel mio caso,

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

E questi sono i permessi ..

<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

non funziona ancora, ottieni questa eccezione: * E/AndroidRuntime (2216): java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {foo.bar/foo.bar.FooActivity}: android.content.ActivityNotFoundException: Nessuna attività trovata per handle Intent {act = android.intent.action.VIEW dat = file: ///mnt/sdcard/Demo.apk typ = application/vnd.android.package_archive flg = 0x10000000} * – user932865

+0

non è ora utilizzabile, perché è intenzionale per le applicazioni di sistema. – CoolMind

3

Anche io

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

e la mia installazione lookd come questo

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

mia path è una stringa, come la vostra f

+0

file: // salva la mia giornata, grazie – djdance

0

Hai bisogno di fare questo

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

Nel codice, hai citato "package_archive", dovrebbe essere "pacchetto-archivio".
Avresti bisogno delle seguenti autorizzazioni.

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

Grazie per tutto l'aiuto, ha funzionato finalmente. Condivido il mio codice di lavoro e lavoro su 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> 

// Fredrik

+1

Ciao Fredrik, dovrei ringraziarti per aver condiviso la tua esperienza su questo. Ho seguito esattamente le stesse istruzioni, ma ricevo "Errore PArser. C'è un problema durante l'analisi del pacchetto". Ho provato a riferire molti forum ma non è stato di grande aiuto. L'aiuto di qualsiasi tipo è apprezzato. – ayachama

+0

Principiante, hai fatto qualche progresso su questo problema? –

+0

@Newbie State usando la stessa firma per entrambi i software? E quale versione di Android stai usando? – user932865

1

Se il targetSdkVersion è uguale o superiore a 24, allora avete bisogno di utilizzare FileProvider implementazione per Android N e più recenti Versioni Android.

Ecco l'intera implementazione:

// 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); 
    } 
} 

Add fornitore FileProvider al AndroidManifest

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

E creare provider_paths.xml sotto risorse XML.

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

Maggiori informazioni sulla configurazione FileProvider si può leggere here e here.

Tutti i crediti vanno a @just_user perché la mia risposta è basata su his reply.