Приложение отлично работает в режиме отладки usb, но когда я создаю подписанный APK и устанавливаю его, оно не работает

#java #android #android-studio #broadcastreceiver #apk

Вопрос:

Я пробовал различные решения, такие как предоставление разрешения на доступ в Интернет в файле манифеста и отключение PROGUARD с помощью useProguard false

Имя моего приложения: SMS_VOICE_NOTIFICATION

Описание моего приложения: поэтому всякий раз, когда мой телефон получает SMS, он считывает SMS-сообщения с помощью преобразования текста в речь, Для этого я использую службу переднего плана, потому что, если я использую фоновую службу, моя система убивает ее через некоторое время.

В режиме отладки все работает отлично, но когда я начинаю генерировать подписанный apk, широковещательный приемник не работает, работает только часть пользовательского интерфейса

Я зарегистрировал Приемник вещания таким образом.

 public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;

@Override
protected void onStart() {

    IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    receiver = new MyReceiver();
    registerReceiver(receiver,intentFilter);
    super.onStart();
} 
 

build.gradle(приложение)

 defaultConfig {
    applicationId "com.example.smsassistsigiri"
    minSdkVersion 23
    targetSdkVersion 30
    multiDexEnabled true
    versionCode 1
    versionName "1.0.1"
    resConfigs "en"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        useProguard false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
 

}

Мой файл build.gradle

 defaultConfig {
    applicationId "com.example.smsassistsigiri"
    minSdkVersion 23
    targetSdkVersion 30
    multiDexEnabled true
    versionCode 1
    versionName "1.0.1"
    resConfigs "en"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        useProguard false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
 

My Broadcast receiver class

 public class MyReceiver extends BroadcastReceiver {

private static  final String SMS_RECEIVED =  "android.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");
      }
}
 

}

Основной файл

 <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

<application
    android:name=".App"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.SMSAssist">
    <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" ></action>
    </intent-filter>
    </receiver>


    <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=".SmsService"/>
</application>
 

Ответ №1:

При создании подписанной сборки Android применяется запутывание, которое иногда удаляет необходимые части кода вашего приложения. Итак, прикрепите тестовое устройство на случай, если вы не работаете с эмулятором, и внимательно следите за журналом, в котором вы можете увидеть проблему, связанную с нарушением кода приложения. Теперь вам нужно добавить исключительные случаи, когда вы не хотите запутывать свой код. Для этого :

  • Откройте proguard-правила.файл pro, который находится в каталоге вашего приложения где-то ниже файла build.gradle.
  • Теперь добавьте исключительные случаи, добавив классы, вызывающие подобные сбои:

    -keep public class com.app.YourActivtyOrFragment { public <methods>; public <fields>; }

Комментарии:

1. но я отключил Proguard, тогда apk должен работать нормально, верно ? это не должно нарушать мой код, если он выключен?

2. @sigri Да, этого не должно быть, тогда, пожалуйста, поделитесь журналами ошибок, также устанавливаете ли вы его непосредственно из вариантов сборки в Android studio или сначала создаете apk, а затем отправляете его на свое устройство и устанавливаете там?

3. Я создаю apk файл, затем отправляю его на свой телефон с помощью веб-приложения what’s app и устанавливаю его на свой телефон

4. итак, теперь, когда вы устанавливаете его, он вылетает при запуске или вы даже не можете его установить? Также есть какие-либо следы logcat?

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

Ответ №2:

Зарегистрировано ли ваше приложение в качестве SMS-сообщения по умолчанию устройства или помощника обработчика? Вы больше не можете использовать разрешения, такие как READ_SMS, если ваше приложение не является обработчиком по умолчанию:

https://support.google.com/googleplay/android-developer/answer/10208820?visit_id=637627208051926352-3034324628amp;rd=1#zippy=,permitted-uses-of-the-sms-and-call-log-permissions