2016-02-15 38 views
1

我有一個服務,它主演一個新線程。我的任務是從這個線程檢索IMEI。我已經試過這樣的事情:Android:不能從線程獲取Imei

主營:

public class MainActivity extends AppCompatActivity { 
String imei; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TelephonyManager mg=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    imei = mg.getDeviceId(); 


    Intent intent = new Intent(); 
    startService(new Intent(getBaseContext(), MyService.class)); 

} 

public String getIMEI(){ 
    Log.d("THIS IS THE IMEI", imei); 
    return imei; 
} 

這是我的服務類:

public class MyService extends Service { 
Connection con = new Connection(); 
@Nullable 
@Override 
public IBinder onBind(Intent intent) { 

    return null; 
} 

@Override 
public void onCreate(){ 

    Thread t = new Thread(con); 
    t.start(); 
} 

這是我運行的類:

public class Connection implements Runnable { 
MainActivity app = new MainActivity(); 

@Override 
public void run() { 
    String imei = app.getIMEI(); 
} 

但是,當我代碼達到String imei = app.getIMEI()我的應用程序崩潰並拋出異常。

了java.lang.RuntimeException:無法啓動活動ComponentInfo {com.asder.vediamo/com.asder.vediamo.MainActivity}:java.lang.SecurityException異常:getDeviceId:無論用戶10057也不當前進程機器人。 permission.READ_PHONE_STATE。

。在我的Android清單:如果你需要一個上下文中使用

MainActivity app = new MainActivity(); 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity android:name=".MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name=".MyService"/> 
</application> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

如果你直接在你的Runnable類中獲得'IMEI'會出現什麼問題? –

+0

目前使用哪個API級別? –

回答

3
MainActivity app = new MainActivity(); 

不使用new運營商在延伸Activity類。在你的情況下,你正在初始化imei,但你的活動沒有經過生命週期,因爲你使用new來實例化它。如果可以,服務可以訪問TelephonyManager。如果您需要在Thread中使用imei,則可以在其構造函數中提供它。例如。

public class Connection implements Runnable { 

    final String imei; 
    public Connection(String i) { 
     imei = i; 
    } 

ServiceonCreate可以檢索imei(你需要的服務經歷其生命週期也一樣)和實例化Runnable,提供IMEI給構造

+0

我試圖從我的服務檢索IMEI ..但它會引發相同的異常..所以我認爲它是不可能檢索到它的服務內.'@Override public void onCreate(){ TelephonyManager mg =( TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String imei = mg.getDeviceId(); Log.d(「TESTTTT」,imei);' –

+0

可以發佈整個清單嗎? – Blackbelt

+0

是的..我正在更新線程。 –

0

的問題是,你自己創建活動,你不應該這樣做Application類,並從中獲取上下文。活動始終通過startActivity命令創建。

然後嘗試使用該上下文來獲得TelephonyManager和IMEI ...

+0

我該怎麼做? –

+0

你有擴展應用程序的類嗎? – neteinstein

0

我是開發人員並且必須在很多設備上測試我們的應用
我在我的新Cagabi One上發現了同樣的問題:IMEI請求在從我的服務中讀取數據時生成一個SecurityException。
我的應用程序在其他一些設備上正常工作,包括另一個Cagabi One,但沒有在新的設備上。
所以,我已經解決了閱讀並保存應用程序(在主線程)啓動時的IMEI號碼,並閱讀從我的服務保存的值。
現在程序工作正常! ;-)
我的建議是總是讀取來自主線程的所有硬件值,以排除衝突和安全異常。
羅伯託。