java应用程序在usb调试模式下运行良好,但当我生成签名的APK并安装它时,它不工作
我尝试过不同的解决方案,比如在清单文件中提供互联网许可&;通过useProguard false关闭PROGUARD
我的应用程序名称:SMS_VOICE_NOTIFICATION
我的应用程序描述:因此,每当我的手机收到短信时,它会使用文本到语音的方式读取短信正文,对于这个即时通讯使用前台服务,因为如果我使用后台服务,我的系统会在一段时间后关闭它
在调试模式下,一切都很好,但当我开始生成签名apk时,广播接收器不工作,只是UI部分工作
我已经这样注册了广播接收器
public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;
@Override
protected void onStart() {
IntentFilter intentFilter = new IntentFilter("安卓.provider.Telephony.SMS_RECEIVED");
receiver = new MyReceiver();
registerReceiver(receiver,intentFilter);
super.onStart();
}
建造。gradle(应用程序)
defaultConfig {
applicationId "com.example.smsassistsigiri"
minSdkVersion 23
targetSdkVersion 30
multiDexEnabled true
versionCode 1
versionName "1.0.1"
resConfigs "en"
testInstrumentationRunner "安卓x.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
useProguard false
proguardFiles getDefaultProguardFile('proguard-安卓-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
我的身材。格雷德尔锉刀
defaultConfig {
applicationId "com.example.smsassistsigiri"
minSdkVersion 23
targetSdkVersion 30
multiDexEnabled true
versionCode 1
versionName "1.0.1"
resConfigs "en"
testInstrumentationRunner "安卓x.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
useProguard false
proguardFiles getDefaultProguardFile('proguard-安卓-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
我的广播接收机课
public class MyReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "安卓.provider.Telephony.SMS_RECEIVED";
//TODO:Implement whats app text to speech
public static final String WHATS_APP_RECEIVED = "";
private static final String TAG = "SmsBroadcastReceiver";
String msg,PhoneNo = "";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"INTENT RECEIVED:"+intent.getAction());
//if(intent.getAction()==SMS_RECEIVED){
if(intent.getAction().equals(SMS_RECEIVED)){
//Retrieve a map of extended data from the intent
Bundle dataBundle = intent.getExtras();
if(dataBundle!=null){
//creating a PDU (PROTOCOL DATA UNIT)
Object[] mypdu = (Object[]) dataBundle.get("pdus");
final SmsMessage[] message = new SmsMessage[mypdu.length];
for(int i=0;i<mypdu.length;i++){
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
//API leve > than 23
String format = dataBundle.getString("format");
message[i] = SmsMessage.createFromPdu((byte[])mypdu[i],format);
}
else{
message[i] = SmsMessage.createFromPdu((byte[])mypdu[i]);
}
msg = message[i].getMessageBody();
PhoneNo = message[i].getOriginatingAddress();
}
SmsService instance = SmsService.getInstance();
//if startservice button is not pressed then if we get a message then instance will be null so that's why we need to check for null
if(instance!=null){
instance.speak(msg);
}
Toast.makeText(context, "Message: "+msg+" \nNumber: "+PhoneNo, Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(context, "Data bundle is null", Toast.LENGTH_SHORT).show();
}
}
else {
Log.e("SMSNOTRECEIVED","SMSNOTRECEIVED");
}
}
}
MainifestFile
<uses-permission 安卓:name="安卓.permission.INTERNET"/>
<uses-permission 安卓:name="安卓.permission.READ_SMS"/>
<uses-permission 安卓:name="安卓.permission.RECEIVE_SMS"/>
<uses-permission 安卓:name="安卓.permission.FOREGROUND_SERVICE"/>
<application
安卓:name=".App"
安卓:allowBackup="true"
安卓:icon="@mipmap/ic_launcher"
安卓:label="@string/app_name"
安卓:roundIcon="@mipmap/ic_launcher_round"
安卓:supportsRtl="true"
安卓:theme="@style/Theme.SMSAssist">
<receiver 安卓:name=".MyReceiver" 安卓:enabled="true" 安卓:exported="true">
<intent-filter>
<action 安卓:name="安卓.provider.Telephony.SMS_RECEIVED" ></action>
</intent-filter>
</receiver>
<activity 安卓:name=".MainActivity">
<intent-filter>
<action 安卓:name="安卓.intent.action.MAIN" />
<category 安卓:name="安卓.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service 安卓:name=".SmsService"/>
</application>
# 1 楼答案
在制作签名的android build时,会应用模糊处理,有时会删除应用程序代码中的必要部分。因此,如果您没有使用模拟器,请连接测试设备,并仔细观察logcat,从中可以看到应用程序代码中断的问题。 现在,您需要添加一些例外情况,以免混淆代码。为此:
开放式前进规则。pro文件,它位于你的应用程序目录下的build下面。格雷德尔档案
现在通过添加导致以下崩溃的类来添加例外情况:
-keep public class com.app.YourActivtyOrFragment { public <methods>; public <fields>; }
# 2 楼答案
您的应用是否注册为设备的默认短信或助理处理程序?除非你的应用程序是默认处理程序,否则你将无法再使用READ_SMS等权限:
https://support.google.com/googleplay/android-developer/answer/10208820?visit_id=637627208051926352-3034324628&rd=1#zippy=%2Cpermitted-uses-of-the-sms-and-call-log-permissions