This might help you.
for Android 10 put this in Manifest.xml
android:requestLegacyExternalStorage="true"
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths" />
</provider>
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<String> = 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<String>(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<out String>, grantResults: IntArray) {
when(requestCode)
{
1000->{
if(Manifest.permission.WRITE_EXTERNAL_STORAGE == permissions[0]) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// you now have permission
requestapkInstallation()
}
}
}
}
}
}