2010-04-14 4 views
42

Я смотрю код камеры Android, и когда я пытаюсь импортировать android.os.SystemProperties, он не может быть найден.Где находится android.os.SystemProperties?

Вот файл я смотрю на:
https://android.googlesource.com/platform/packages/apps/Camera/+/eclair-release/src/com/android/camera/VideoCamera.java

Я создал новый проект 2.1 и попытался снова импортировать это пространство имен, но она все еще не может быть найден. Я проверил https://developer.android.com и SystemProperties не был указан.

Я что-то пропустил?

ответ

29

Это класс в исходном коде Android:

https://android.googlesource.com/platform/frameworks/base/+/eclair-release/core/java/android/os/SystemProperties.java

См {@hide} в классе JavaDoc? Это означает, что этот класс не будет экспортироваться как часть общедоступного SDK.

Приложение камеры использует его как внутреннее, и они не будут использовать общедоступный SDK для его создания.

Вы можете все еще быть в состоянии получить в этом классе

  1. отражением или

  2. получая источник, удаление @hide и сделать свой собственный настроенную SDK.

Однако в значительной степени по определению теперь вы собираетесь «off SDK» и, следовательно, ваше приложение может также быть нарушены или получить различное поведение на версию ОС как Android люди будут делать мало усилий, чтобы не изменить этот класс между версиями.

+3

Если вышеуказанная ссылка на исходный код не работает, вы можете попробовать этот файл: http://androidxref.com/4.3_r2.1/xref/frameworks/base/core/java/android/os/SystemProperties.java – Vins

+0

@Jim Блэклер: не могли бы вы подробнее рассказать о втором решении. как я могу сделать свой собственный SDK? –

12

Вы можете EXEC к команде getprop:

String line = ""; 
try { 
Process ifc = Runtime.getRuntime().exec("getprop ro.hardware"); 
BufferedReader bis = new BufferedReader(new InputStreamReader(ifc.getInputStream())); 
line = bis.readLine(); 
} catch (java.io.IOException e) { 
} 
ifc.destroy(); 
+0

В getprop нет IMEI/IMSI: https://guardianproject.info/wiki/Google_Nexus_S_I9023_running_stock_4.0.4 –

+0

Вот пример по accuya: http://stackoverflow.com/a/11623309/4515489 – jk7

55

Если вы используете опцию «отражения», вы можете использовать класс ниже

package com.etc.etc; 

import java.io.File; 
import java.lang.reflect.Method; 
import android.content.Context; 
import dalvik.system.DexFile; 


public class SystemPropertiesProxy 
{ 

/** 
* This class cannot be instantiated 
*/ 
private SystemPropertiesProxy(){ 

} 

    /** 
    * Get the value for the given key. 
    * @return an empty string if the key isn't found 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static String get(Context context, String key) throws IllegalArgumentException { 

     String ret= ""; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[1]; 
      paramTypes[0]= String.class; 

      Method get = SystemProperties.getMethod("get", paramTypes); 

      //Parameters 
      Object[] params= new Object[1]; 
      params[0]= new String(key); 

      ret= (String) get.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= ""; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key. 
    * @return if the key isn't found, return def if it isn't null, or an empty string otherwise 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static String get(Context context, String key, String def) throws IllegalArgumentException { 

     String ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= String.class;   

      Method get = SystemProperties.getMethod("get", paramTypes); 

      //Parameters 
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new String(def); 

      ret= (String) get.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key, and return as an integer. 
    * @param key the key to lookup 
    * @param def a default value to return 
    * @return the key parsed as an integer, or def if the key isn't found or 
    *   cannot be parsed 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static Integer getInt(Context context, String key, int def) throws IllegalArgumentException { 

     Integer ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= int.class; 

      Method getInt = SystemProperties.getMethod("getInt", paramTypes); 

      //Parameters 
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new Integer(def); 

      ret= (Integer) getInt.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key, and return as a long. 
    * @param key the key to lookup 
    * @param def a default value to return 
    * @return the key parsed as a long, or def if the key isn't found or 
    *   cannot be parsed 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static Long getLong(Context context, String key, long def) throws IllegalArgumentException { 

     Long ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
       Class SystemProperties= cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= long.class; 

      Method getLong = SystemProperties.getMethod("getLong", paramTypes); 

      //Parameters 
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new Long(def); 

      ret= (Long) getLong.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key, returned as a boolean. 
    * Values 'n', 'no', '0', 'false' or 'off' are considered false. 
    * Values 'y', 'yes', '1', 'true' or 'on' are considered true. 
    * (case insensitive). 
    * If the key does not exist, or has any other value, then the default 
    * result is returned. 
    * @param key the key to lookup 
    * @param def a default value to return 
    * @return the key parsed as a boolean, or def if the key isn't found or is 
    *   not able to be parsed as a boolean. 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static Boolean getBoolean(Context context, String key, boolean def) throws IllegalArgumentException { 

     Boolean ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= boolean.class; 

      Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes); 

      //Parameters   
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new Boolean(def); 

      ret= (Boolean) getBoolean.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Set the value for the given key. 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    * @throws IllegalArgumentException if the value exceeds 92 characters 
    */ 
    public static void set(Context context, String key, String val) throws IllegalArgumentException { 

     try{ 

      @SuppressWarnings("unused") 
      DexFile df = new DexFile(new File("/system/app/Settings.apk")); 
      @SuppressWarnings("unused") 
      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = Class.forName("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= String.class; 

      Method set = SystemProperties.getMethod("set", paramTypes); 

      //Parameters   
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new String(val); 

      set.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      //TODO 
     } 

    } 
} 
+0

Это работает? Я попробовал SystemPropertiesProxy.get (это, «android.telephony.TelephonyProperties.PROPERTY_IMSI»); но приходит пусто. –

+0

@ bruno.braga, это не та собственность, которая получена из SystemProperties. Чтобы увидеть, какие свойства вы можете получить с вашего устройства таким образом, запустите 'adb shell getprop'. – lapis

+0

@Psycho, да, я знаю ... это точка ... ни для одного из устройств, которые я тестировал, это доступно в getprop. Вот почему я думаю, что это просто не работает. –

14

После много возни я ve наконец получил код отражения выше, работая как для набора, так и для создания новых собственных свойств системы, есть некоторые оговорки:

  1. Вы должны быть системным пользователем, добавить: android: sharedUserId = "android.uid.system" в манифест.

  2. Вы должны подписать APK с помощью ключа платформы, я изменял и просто отменяю ключ к подписи отладки по умолчанию в затмении, как показано здесь: http://stoned-android.blogspot.co.uk/2012_01_01_archive.html

  3. Уроженец свойство системы обслуживания имеет ACL, который контролирует все писать доступ к свойствам, вы можете подорвать ключевое пространство (например, sys. или debug.). См /system/core/init/property_service.c:

    { "сеть", AID_SYSTEM, 0}, { "девиация", AID_SYSTEM, 0}, { "во время выполнения.", AID_SYSTEM, 0 }, {"hw.», AID_SYSTEM, 0}, { "SYS.", AID_SYSTEM, 0}, { "сервис.", AID_SYSTEM, 0}, { "WLAN"., AID_SYSTEM, 0}, { "DHCP.", AID_SYSTEM, 0},

Или, если вы свертываете свой собственный билд, вы можете добавить свой собственный ключ, если вы действительно хотели, но мне кажется, проще повторно использовать один из вышеперечисленных.

21

класс размещен как Ответ от пользователя У Void есть куча ненужных вещей. Вот мой класс, который использует отражение на android.os.SystemProperties:

/* 
* Copyright (C) 2015 Jared Rummler 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

/** 
* Gives access to the system properties store. The system properties store contains a list of 
* string key-value pairs. 
*/ 
public class SystemProperties { 

    private static final Class<?> SP = getSystemPropertiesClass(); 

    /** 
    * Get the value for the given key. 
    */ 
    public static String get(String key) { 
    try { 
     return (String) SP.getMethod("get", String.class).invoke(null, key); 
    } catch (Exception e) { 
     return null; 
    } 
    } 

    /** 
    * Get the value for the given key. 
    * 
    * @return if the key isn't found, return def if it isn't null, or an empty string otherwise 
    */ 
    public static String get(String key, String def) { 
    try { 
     return (String) SP.getMethod("get", String.class, String.class).invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    /** 
    * Get the value for the given key, returned as a boolean. Values 'n', 'no', '0', 'false' or 
    * 'off' are considered false. Values 'y', 'yes', '1', 'true' or 'on' are considered true. (case 
    * sensitive). If the key does not exist, or has any other value, then the default result is 
    * returned. 
    * 
    * @param key 
    *  the key to lookup 
    * @param def 
    *  a default value to return 
    * @return the key parsed as a boolean, or def if the key isn't found or is not able to be 
    * parsed as a boolean. 
    */ 
    public static boolean getBoolean(String key, boolean def) { 
    try { 
     return (Boolean) SP.getMethod("getBoolean", String.class, boolean.class) 
      .invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    /** 
    * Get the value for the given key, and return as an integer. 
    * 
    * @param key 
    *  the key to lookup 
    * @param def 
    *  a default value to return 
    * @return the key parsed as an integer, or def if the key isn't found or cannot be parsed 
    */ 
    public static int getInt(String key, int def) { 
    try { 
     return (Integer) SP.getMethod("getInt", String.class, int.class).invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    /** 
    * Get the value for the given key, and return as a long. 
    * 
    * @param key 
    *  the key to lookup 
    * @param def 
    *  a default value to return 
    * @return the key parsed as a long, or def if the key isn't found or cannot be parsed 
    */ 
    public static long getLong(String key, long def) { 
    try { 
     return (Long) SP.getMethod("getLong", String.class, long.class).invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    private static Class<?> getSystemPropertiesClass() { 
    try { 
     return Class.forName("android.os.SystemProperties"); 
    } catch (ClassNotFoundException shouldNotHappen) { 
     return null; 
    } 
    } 

    private SystemProperties() { 
    throw new AssertionError("no instances"); 
    } 

} 
+0

Я вижу, что метод set не работает. Мое устройство укоренилось. Когда я запускаю ваш код, приложение SuperSU не отображает диалоговое окно для получения разрешения. Поэтому я думаю, что ваш код действительно не вызывает разрешения. – hqt

+0

@hqt вам нужно будет запустить setprop в оболочке. Я должен удалить метод setprop. –

1

После многих поисков я нашел способ установить системное свойство для Android. Мне не удалось найти решение для Android Lollipop. Но мне это удалось. Для установки системного имущества нам необходимо использовать:

import android.os.SystemProperties 
SystemProperties.set(key, value). 

, например. SystemProperties.set("sys.android", 5.0)

Теперь вы должны дать разрешение на новое свойство системы Перейти к /home/inkkashy04/Android_Lollypop/external/sepolicy/property_contexts и дать подходящее разрешение на вашу собственность

sys.android и: object_r: system_prop: s0

Теперь после мигания изображения вы можете увидеть свои системные свойства, перечисленные по команде:

adb shell getprop 
Смежные вопросы