Android:无法从线程中获取Imei

时间:2016-02-15 10:15:51

标签: android multithreading runnable imei

我有一个新线程的服务。我的任务是从这个线程中检索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();
}

这是我的Runnable类:

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和当前进程都没有android.permission.READ_PHONE_STATE

在我的机器人清单中:

<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" />

3 个答案:

答案 0 :(得分:3)

MainActivity app = new MainActivity();

请勿在{{1​​}}扩展的类上使用new运算符。在您的情况下,您正在初始化Activity,但您的Activity未经历生命周期,因为您使用imei来实例化它。如果可以,服务可以访问new。如果您需要在TelephonyManager中使用imei,可以在其构造函数中提供它。 E.g。

Thread

在您的public class Connection implements Runnable { final String imei; public Connection(String i) { imei = i; } Service中,您可以检索onCreate(您还需要服务完成其生命周期)并实例化imei ,将imei提供给构造函数

答案 1 :(得分:0)

问题是你自己创建了一个Activity,你永远不应该这样做:

MainActivity app = new MainActivity();

如果您需要上下文,请使用Application类,并从中获取上下文。始终通过startActivity命令在操作系统中创建活动。

然后尝试使用该上下文获取TelephonyManager和IMEI ...

答案 2 :(得分:0)

我是开发人员,必须在许多设备上测试我们的应用程序 我在新的Cagabi One上发现了同样的问题:从我的服务中读取数据时,IMEI请求会生成SecurityException。
我的应用程序在其他一些设备上正常工作,包括另一个Cagabi One,但不在新的设备中 所以,我已经解决了读取并在应用程序启动时保存了IMEI号(在主线程中),因此读取了从我的服务中保存的值。
程序工作正常! ;-)
我的建议是始终读取主线程中的所有硬件值,以排除冲突和安全例外 罗伯特。