Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.6k views
in Technique[技术] by (71.8m points)

c# - Xamarin Forms Android Ad-Hoc apk update There was a problem parsing the package

Trying to create an android autoupdater for an ahoc app in Xamarin forms. here is my code and manifest and paths xml.

The app launches fine and i can get the updater dialog. it then seems to download the apk but when it comes to install it i get the 'There was a problem parsing the package' error.

I have tried loads of different ways to do this so some pointers would be cool.

i also tried to look in logcat in release and its saying file permission error but im not sure if this is a red herring or not.

Anyone got any ideas?

```
public async void LaunchActivityInAndroid()
        {


            string documentsPath = $"{Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath}";

            string m_uri = $"{GlobalVariables.ApkPrefix}{GlobalVariables.ApkDomain}{GlobalVariables.ApkEndpoint}";
            string fileName = m_uri.Substring(m_uri.LastIndexOf("/") + 1);

            HttpResponseMessage httpResponse = await new HttpClient().GetAsync(m_uri);
            byte[] data = await httpResponse.Content.ReadAsByteArrayAsync();

            string directory = Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath.ToString();
            string path = Path.Combine(directory, fileName);
            foreach (string file in Directory.GetFiles(directory))
            {
                if (Path.GetExtension(file) == ".apk")
                {
                    File.Delete(file);
                    File.Delete("app.db3");
                }

            }

            File.WriteAllBytes(path, data);

            Android.Net.Uri fileUri;
            if ((int)Build.VERSION.SdkInt < 23) {
                fileUri = Android.Net.Uri.FromFile(new Java.IO.File(path));
            }
            else {
                fileUri = FileProvider.GetUriForFile(Xamarin.Forms.Forms.Context as Context, Xamarin.Forms.Forms.Context.ApplicationContext.PackageName + ".fileprovider", new Java.IO.File(documentsPath + "/app.apk")); 
            }

            Intent promptInstall = new Intent(Intent.ActionView).SetFlags(ActivityFlags.ClearTop).SetFlags(ActivityFlags.GrantReadUriPermission).SetFlags(ActivityFlags.NewTask).PutExtra(Intent.ExtraNotUnknownSource, true).SetDataAndType(fileUri, "application/vnd.android.package-archive");
            Android.App.Application.Context.StartActivity(promptInstall);


            //webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback);

        }
''' 

Manifest

```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.99" package="app" android:installLocation="auto" android:versionCode="1">
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="29" />
    <application android:label="app.Android" android:icon="@mipmap/ic_launcher" android:networkSecurityConfig="@xml/network_security_config" android:allowBackup="false" android:requestLegacyExternalStorage="true">
        <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"></meta-data>
        </provider>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
    <uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
    <uses-permission android:name="android.permission.WRITE_PROFILE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.DELETE_PACKAGES" />
</manifest>

```

provider paths xml

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

Thanks in advance guys!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...