2013-04-22 6 views
8

में हवाई जहाज मोड मैं एंड्रॉइड 4.2.2 के साथ नेक्सस 4 में हवाई जहाज मोड सेट करने की कोशिश कर रहा हूं। मुझे पता है कि यह संभव नहीं है क्योंकि AIRPLANE_MODE_ON को Global system settings पर ले जाया गया था और यह केवल एक पढ़ा गया विकल्प है।जेली बीन

क्या ऐसा कुछ करने का कोई और तरीका है, मेरा मतलब रेडियो को अक्षम करना है? मैं ब्लूटूथ, वाईफ़ाई और इंटरनेट कनेक्शन अक्षम कर सकता हूं, लेकिन फोन कॉल नेटवर्क अभी भी सक्रिय है।

NDK के साथ लाइब्रेरी बनाने के लिए संभवतः नेटवर्क को अक्षम करने के लिए संभव हो सकता है?

संपादित: मैं java.lang.reflect इस विधि बनाने के साथ की कोशिश की है:

@SuppressLint("NewApi") 
@SuppressWarnings("rawtypes") 
private boolean putStringAirplaneMode() throws ClassNotFoundException, 
     NoSuchMethodException, IllegalArgumentException, 
     IllegalAccessException, InvocationTargetException { 

    ContentResolver resolver = context.getContentResolver(); 
    String name = Settings.Global.AIRPLANE_MODE_ON; 
    String value = (isEnabled() ? "1" : "0"); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     Log.v("AirplaneBatterySaver", 
       "Using reflection to change airplane mode"); 
     // For JELLY_BEAN_MR1 use reflection. TODO test if works reflection 
     Class SystemProperties = android.provider.Settings.Global.class; 

     Class[] parameterTypes = new Class[3]; 
     parameterTypes[0] = ContentResolver.class; 
     parameterTypes[1] = String.class; 
     parameterTypes[2] = String.class; 

     @SuppressWarnings("unchecked") 
     Method method = SystemProperties.getMethod("putString", 
       parameterTypes); 

     method.setAccessible(true); 
     return (Boolean) method.invoke(new Object(), resolver, name, value); 
     // return Settings.Global.putString(resolver, name, value); 

    } else { 
     Log.v("AirplaneBatterySaver", 
       "Using Settings.System to change airplane mode"); 
     return Settings.System.putString(resolver, name, value); 
    } 
} 

आप देख सकते हैं मैं JELLY_BEAN_MR1 से अधिक विधि Settings.System.putString(resolver, name, value); की जगह लेकिन, ज़ाहिर है, मैं हो रही है एक SecurityException क्योंकि मेरे एप्लिकेशन नहीं है एक सिस्टम ऐप

Caused by: java.lang.SecurityException: Permission denial: writing to secure 
    settings requires android.permission.WRITE_SECURE_SETTINGS 
at android.os.Parcel.readException(Parcel.java:1425) 
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) 
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
at android.content.ContentProviderProxy.call(ContentProviderNative.java:574) 
at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:777) 
at android.provider.Settings$Global.putStringForUser(Settings.java:5421) 
at android.provider.Settings$Global.putString(Settings.java:5411) 

अगर मैं <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/> का उपयोग मैं त्रुटि Permission is only granted to system apps मिल: यह पता लगाने है। मैं एसडीके स्रोतों (ट्रेस से फाइलों में) की जांच कर रहा था ताकि इस अनुमति के बिना हवाई जहाज मोड को सेट करने का कोई तरीका ढूंढ सके, लेकिन मुझे कोई सफलता नहीं मिली।

+0

आपको इस प्रश्न का उत्तर पहले से ही इस साइट पर मिल जाएगा! "4.2 विमान मोड" के लिए खोज करने का प्रयास करें। असल में, यह सेटिंग 4.2 से इस सेटिंग को बदलने के लिए अब संभव नहीं है, जब तक कि आपके एप्लिकेशन में रूट न हो (जवाब भी है कि यह कैसे करना है)। – shadrx

+0

आपके उत्तर के लिए धन्यवाद। मैं वास्तव में इस सेटिंग को बदलने के लिए नहीं देख रहा हूं (हवाई जहाज मोड), वैसे भी मैं स्टैक ओवरफ्लो में कड़ी मेहनत करता हूं। मैं कुछ अलग तरीके से ऐसा करने के लिए देख रहा हूं (यदि संभव हो)। मेरे ऐप के लिए रूट अनुमतियों का उपयोग एक विकल्प नहीं है। – Freefri

उत्तर

5

4.2.2 के रूप में आप हवाई जहाज मोड को टॉगल नहीं कर सकते क्योंकि यह केवल पढ़ने के लिए है।

आपके पास दो विकल्प हैं।

  1. अपने एप्लिकेशन को System एप्लिकेशन बनाएं। यानी एक फोन रूट करें, अपने एपीके को /system/app पर दबाएं और वहां से इंस्टॉल करें। यह आपको हवाई जहाज मोड टॉगल करने में सक्षम करेगा।
  2. एंड्रॉइड सिस्टम फ़ंक्शन कॉल को पकड़ने के लिए Reflection का उपयोग करें जो विमान मोड को टॉगल करता है।

आपको एक्सपोजर एपीआई प्राप्त करने के लिए प्रतिबिंब का उपयोग करने के तरीके पर कोड नमूने प्राप्त करना चाहिए अन्यथा एसडीके के माध्यम से डेवलपर को उजागर नहीं किया जाना चाहिए।

+0

क्या आप मुझे Android सिस्टम फ़ंक्शन कॉल को पकड़ने के लिए प्रतिबिंब का उपयोग करने के बारे में कोई संदर्भ दे सकते हैं? – Freefri

+0

http://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful थोड़ा सा समझाता है। मुझे यकीन है कि आपको अधिक संसाधन मिलेंगे क्योंकि यह आमतौर पर उपयोग की जाने वाली विधि है। –

+0

धन्यवाद, लेकिन मैं इसे काम करने में सक्षम नहीं था। मैंने सवाल संपादित किया है। – Freefri

संबंधित मुद्दे