how to install apk file programmatically

前端 未结 5 1824
别跟我提以往
别跟我提以往 2020-12-09 13:30

I want to install an apk file from my application.

I have created an app that contains a button, when I click that button then another apk that I have stored in res

5条回答
  •  暖寄归人
    2020-12-09 14:26

    This might help you. for Android 10 put this in Manifest.xml

    android:requestLegacyExternalStorage="true"

           
                
            
    

    MainActivity.kt

    import android.Manifest
    import android.content.Intent
    import android.content.pm.PackageManager
    import android.os.Build
    import android.os.Bundle
    import android.os.Environment
    import android.os.StrictMode
    import android.os.StrictMode.VmPolicy
    import androidx.appcompat.app.AppCompatActivity
    import androidx.core.app.ActivityCompat
    import androidx.core.content.FileProvider
    import kotlinx.android.synthetic.main.activity_main.*
    import java.io.File
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            test.setOnClickListener {
                val arrPerm: ArrayList = ArrayList()
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                }
                if (arrPerm.isNotEmpty()) {
                    var permissions = arrayOfNulls(arrPerm.size)
                    permissions = arrPerm.toArray(permissions)
                    ActivityCompat.requestPermissions(this, permissions, 1000)
                } else {
    
                    requestapkInstallation()
    // FileProvider.getUriForFile(this, applicationContext.packageName + ".provider",File("/storage/emulated/0/Download/test.apk"))
                }
            }
        }
    
        fun requestapkInstallation() {
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
                val builder = VmPolicy.Builder()
                StrictMode.setVmPolicy(builder.build())
                val fileUri = FileProvider.getUriForFile(
                    this,
                    applicationContext.packageName + ".provider",
                    File(Environment.getExternalStorageDirectory().toString() + "/download/" + "app-debug.apk")
                )
                val intent1 = Intent(Intent.ACTION_VIEW);
                intent1.setDataAndType(
                    fileUri,
                    "application/vnd.android.package-archive"
                );
                intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent1.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent1.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                intent1.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
                startActivity(intent1);
            } else {
                val fileUri = FileProvider.getUriForFile(
                    this,
                    applicationContext.packageName + ".provider",
                    File(Environment.getExternalStorageDirectory().toString()+ "/download/" + "app-debug.apk")
                )
                val intent = Intent(Intent.ACTION_VIEW, fileUri)
                intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
                intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                intent.setDataAndType(fileUri, "application/vnd.android.package-archive")
    
                startActivity(intent)
            }
        }
    
        override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
        when(requestCode)
        {
            1000->{
                if(Manifest.permission.WRITE_EXTERNAL_STORAGE == permissions[0]) {
                    if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // you now have permission
                        requestapkInstallation()
                    }
                }
            }
        }
    }
    

    }

提交回复
热议问题