我有一个新线程的服务。我的任务是从这个线程中检索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" />
答案 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号(在主线程中),因此读取了从我的服务中保存的值。
程序工作正常! ;-)
我的建议是始终读取主线程中的所有硬件值,以排除冲突和安全例外
罗伯特。