Я делаю apk AutoInstall используя Unity - PullRequest
0 голосов
/ 16 января 2019

Копирую источник следуйте по ссылке Как установить Android apk из кода в единстве

но если я играю в телефоне, это показывает ошибку

Ошибка: android.content.ActivityNotFoundException: не найдена активность для обработки Intent {act = android.intent.action.VIEW dat = content: //com.mycompany.productname.fileprovider/files_root/files/data/ApkDownload.apk typ = applcation / vnd.android.package-archive flg = 0x10000001}

Код:

public class AutoUpdateNew : MonoBehaviour {
    public string downloadurl;
    void Start()
    {
        StartCoroutine(downLoadFromServer());
    }

    IEnumerator downLoadFromServer()
    {
        //downloadurl = string url;
        string url = "https://drive.google.com/uc?export=download&id=1SUqRAITK-8ezVA7t6ORuuS8X9f69ei8v";


        string savePath = Path.Combine(Application.persistentDataPath, "data");
        savePath = Path.Combine(savePath, "ApkDownload.apk");

        Dictionary<string, string> header = new Dictionary<string, string>();
        string userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";
        header.Add("User-Agent", userAgent);
        WWW www = new WWW(url, null, header);


        while (!www.isDone)
        {
            //Must yield below/wait for a frame
            GameObject.Find("TextDebug").GetComponent<Text>().text = "Stat: " + www.progress;
            yield return null;
        }

        byte[] yourBytes = www.bytes;

        GameObject.Find("TextDebug").GetComponent<Text>().text = "Done downloading. Size: " + yourBytes.Length;


        //Create Directory if it does not exist
        if (!Directory.Exists(Path.GetDirectoryName(savePath)))
        {
            Directory.CreateDirectory(Path.GetDirectoryName(savePath));
            GameObject.Find("TextDebug").GetComponent<Text>().text = "Created Dir";
        }

        try
        {
            //Now Save it
            System.IO.File.WriteAllBytes(savePath, yourBytes);
            Debug.Log("Saved Data to: " + savePath.Replace("/", "\\"));
            GameObject.Find("TextDebug").GetComponent<Text>().text = "Saved Data";
        }
        catch (Exception e)
        {
            Debug.LogWarning("Failed To Save Data to: " + savePath.Replace("/", "\\"));
            Debug.LogWarning("Error: " + e.Message);
            GameObject.Find("TextDebug").GetComponent<Text>().text = "Error Saving Data";
        }

        //Install APK
        installApp(savePath);
    }
   /*
    public bool installApp(string apkPath)
    {
        try
        {
            AndroidJavaClass intentObj = new AndroidJavaClass("android.content.Intent");
            string ACTION_VIEW = intentObj.GetStatic<string>("ACTION_VIEW");
            int FLAG_ACTIVITY_NEW_TASK = intentObj.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
            AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);

            AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
            AndroidJavaClass uriObj = new AndroidJavaClass("android.net.Uri");
            AndroidJavaObject uri = uriObj.CallStatic<AndroidJavaObject>("fromFile", fileObj);

            intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
            intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
            intent.Call<AndroidJavaObject>("setClassName","com.mycompany.productname","com.mycompany.productname.PackageInstallerActivity");

            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            currentActivity.Call("startActivity", intent);

            GameObject.Find("TextDebug").GetComponent<Text>().text = "Success";
            return true;
        }
        catch (System.Exception e)
        {
            GameObject.Find("TextDebug").GetComponent<Text>().text = "Error: " + e.Message;
            return false;
        }
    }*/

    private bool installApp(string apkPath)
    {
        bool success = true;
        GameObject.Find("TextDebug").GetComponent<Text>().text = "Installing App";

        try
        {
            //Get Activity then Context
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");

            //Get the package Name
            string packageName = unityContext.Call<string>("getPackageName");
            string authority = packageName + ".fileprovider";

            AndroidJavaClass intentObj = new AndroidJavaClass("android.content.Intent");
            string ACTION_VIEW = intentObj.GetStatic<string>("ACTION_VIEW");
            AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);


            int FLAG_ACTIVITY_NEW_TASK = intentObj.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
            int FLAG_GRANT_READ_URI_PERMISSION = intentObj.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");

            //File fileObj = new File(String pathname);
            AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
            //FileProvider object that will be used to call it static function
            AndroidJavaClass fileProvider = new AndroidJavaClass("android.support.v4.content.FileProvider");
            //getUriForFile(Context context, String authority, File file)
            AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", unityContext, authority, fileObj);

            intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
            intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
            intent.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION);
            currentActivity.Call("startActivity", intent);

            GameObject.Find("TextDebug").GetComponent<Text>().text = "Success";
        }
        catch (System.Exception e)
        {
            GameObject.Find("TextDebug").GetComponent<Text>().text = "Error: " + e.Message;
            success = false;
        }

        return success;
    }

}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.productname" xmlns:tools="http://schemas.android.com/tools" 
          android:installLocation="preferExternal" android:versionName="1.0" android:versionCode="1">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>



    <provider
          android:name="android.support.v4.content.FileProvider"
          android:authorities="com.success.apkupdateTest.fileprovider"
          android:exported="false"
          android:grantUriPermissions="true">
      <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/provider_paths"/>
    </provider>
    <activity android:name=".PackageInstallerActivity">
    </activity>
  </application>
  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
</manifest>

1 Ответ

0 голосов
/ 16 января 2019

В ссылке, которую вы указали в своем вопросе, автор сказал:

Для Android API 24 и выше для этого требуется другой код, поскольку API изменен.

Таким образом, вы должны проверить версию вашего устройства, используя такие методы, как this , а затем вызвать соответствующую функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...