8

में प्रोग्रामेटिक रूप से एक एपीके स्थापित करें मैं अपने एप को स्वचालित रूप से एपीके इंस्टॉल करने की कोशिश कर रहा हूं। यह एपीआई < 24 के लिए ठीक काम करता है। लेकिन 24 के लिए, यह असफल रहा है। एंड्रॉयड अतिरिक्त सुरक्षा लागू किया गया है: अपने एप्लिकेशन के बाहर // यूआरआई:एंड्रॉइड 7/api24

एंड्रॉयड 7.0 को लक्षित ऐप के लिए, एंड्रॉयड ढांचे StrictMode एपीआई नीति है कि फ़ाइल उजागर की अनुमति नहीं देतीं लागू करता है। यदि फ़ाइल यूआरआई युक्त कोई इरादा आपके ऐप को छोड़ देता है, तो ऐप FileUriExposedException अपवाद के साथ विफल रहता है।

तो मैं इस कोशिश की:

Uri myuri; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N){ 
     myuri = Uri.parse("file://"+outapk); 
    } else { 
     File o = new File(outapk); 
     myuri = FileProvider.getUriForFile(con, con.getApplicationContext().getPackageName() + ".provider", o); 
    } 
    Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(myuri,"application/vnd.android.package-archive"); 
    con.startActivity(promptInstall); 

लेकिन एक घातक अपवाद प्राप्त करें:

com.android.packageinstaller "Caused by: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{b42ee8a 6826:com.android.packageinstaller/u0a15} (pid=6826, uid=10015) that is not exported from uid 10066". 

मैं निर्यात मेरी प्रकट में = सच है।

समस्या यह प्रतीत होती है कि पैकेज इंस्टॉलर सामग्री का उपयोग नहीं कर सकता: // uri।

क्या ऐप को एपीआई 24 के साथ एपीके स्थापित करने की अनुमति देने के कोई तरीके हैं?

उत्तर

6

क्या ऐप को एपीआई 24 के साथ एपीके स्थापित करने की अनुमति देने के किसी भी तरीके हैं?

सामग्री को पढ़ने के लिए अपने promptInstall सेटअप में addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) जोड़ें।

मेरे पास मेरे मैनिफेस्ट में निर्यात = सत्य है।

आपके FileProvider पर नहीं, क्योंकि इससे आपका ऐप क्रैश हो जाएगा।

समस्या यह प्रतीत होती है कि पैकेज इंस्टॉलर सामग्री का उपयोग नहीं कर सकता: // uri।

नहीं, समस्या यह है कि आपने पैकेजर इंस्टॉलर को उस Uri से पढ़ने के लिए अनुमति नहीं दी है। अगर पैकेज इंस्टॉलर content योजना का उपयोग करने में असमर्थ था, तो आपको ActivityNotFoundException मिल गया होगा।

नोट, हालांकि, यह केवल एंड्रॉइड 7.0 के साथ है कि पैकेज इंस्टॉलर content का समर्थन करना शुरू करता है। एंड्रॉइड के पहले संस्करणों को file का उपयोग करना होगा।

+0

बहुत बढ़िया। उसने ऐसा किया धन्यवाद! – elsie

+0

ऐडफ्लैग (Intent.FLAG_GRANT_READ_URI_PERMISSION) ने भी मेरे लिए काम किया। –

+0

हे कॉमन्सवेयर। अगर हम एन और निचले एपिस के लिए ... और अधिक उपयोग करना है? ऐसा करने का कोई और तरीका नहीं है? – David