2011-12-12 26 views
5

Bir apk dosyasını belirli bir sunucudan otomatik olarak indiren ve sisteme yükleyen bir uygulama oluşturmaya çalışıyorum. Kurulum için kodum aşağıdaki gibi görünüyor, ancak çalışmıyor. Başka bir programdan yükleyin 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);    

i kurulum için Manifest.xml herhangi bir hak sağlaması gerekir mi? Bu sorunun daha önce sorulmuş olduğunu biliyorum, ancak cevapların hiçbiri bana şu ana kadar yardımcı olmadı.

+1

Cevabımda belirttiğim gibi, "package_archive" değil "paket arşivi" kullanın. Umarım bu ActivityNotFoundException çözer. – Karthik

cevap

9

Ben benim durumumda ne bu,

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

Ve bu izinlerin vardır ..

<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

hala çalışmıyor, bu istisnayı alın: * E/AndroidRuntime (2216): java.lang.RuntimeException: Etkinlik başlatılamıyor ComponentInfo {foo.bar/foo.bar.FooActivity}: android.content.ActivityNotFoundException: Etkinlik bulunamadı Intent {act = android.intent.action.VIEW dat = dosya: ///mnt/sdcard/Demo.apk typ = uygulama/vnd.android.package_archive flg = 0x10000000} * – user932865

+0

şu anda kullanılmamaktadır, çünkü sistem uygulamaları için amaçlanmıştır. – CoolMind

3

ben de yapmak

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

ve benim bu

gibi lookd yüklemek
intent.setDataAndType(Uri.parse("file://"+path), "application/vnd.android.package-archive"); 
benim

Kodunuzdaki bu

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

yapmanız gereken sizin f

+0

dosya: // günümü kurtar, teşekkürler – djdance

0

gibi bir dize, sen, o "paket-arşiv" olmalıdır "package_archive" belirtmiştik.
Aşağıdaki izinlere ihtiyacınız olacaktır. Tüm yardım için

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

sayesinde son çalışmaya yaptı. Çalışma kodumu paylaşıyorum ve Manifest.xml dosyasını çalıştırıyorum.

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

Merhaba Fredrik, Deneyimlerinizi paylaştığınız için size teşekkür etmeliyim. Tam olarak aynı talimatları takip ettim, fakat "PArser Error." Paketi ayrıştırmada bir sorun var. " Birçok forumdan bahsetmeyi denedim, ancak büyük bir yardım değildi. Her türlü yardım takdir edilmektedir. – ayachama

+0

Newbie, bu konuda herhangi bir ilerleme kaydettiniz mi? –

+0

@Newbie Her iki yazılım için de aynı imzayı kullanıyor musunuz? Ve hangi android sürümünü kullanıyorsunuz? – user932865

1

targetSdkVersion eşit veya 24 daha yüksektir senin, o zaman Android N ve yeni için FileProvider uygulanmasını kullanmanız gerekirse Android sürümleri.

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

Ekleme sağlayıcı FileProvider xml kaynaklara altında provider_paths.xml

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

AndroidManifest Ve oluşturun:

İşte bütün uygulamasıdır. FileProvider yapılandırması hakkında

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

diğer bilgiler size here ve here okuyabilir.

Tüm krediler @just_user adresine git çünkü benim cevabım his reply.

İlgili konular