Отправленное СМС не может получить для определенного устройства - PullRequest
0 голосов
/ 01 октября 2019

Я получаю отправленные и полученные SMS-сообщения практически с устройств. но я не могу получить его от конкретного устройства в конкретной модели. Как и самсунги S7, S8, S9. и некоторые устройства LG.

Странно, некоторые устройства S7 работают, а некоторые нет.

Вот способ, которым я пользуюсь.

Регистрация наблюдателя в классе приложений.

private void registerMessageObserver() {
    String url = "content://sms/";
    Uri uri = Uri.parse(url);
    this.getApplicationContext()
            .getContentResolver()
            .registerContentObserver(uri, true,
                    new MessageObserver(new Handler(), this));
}

// Класс наблюдателя

import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;

public class MessageObserver extends ContentObserver {

      private static final String TAG = "MessageObserver";
      Context moContext;


      // Observe message state incoming or outgoing
      public MessageObserver(Handler handler, Context foContext) {
          super(handler);
          moContext = foContext;
      }


       @Override
       public boolean deliverSelfNotifications() {
             Log.i(TAG, "deliverSelfNotifications Changed");
             return true;
       }

       @Override
       public void onChange(boolean selfChange) {
            Log.i(TAG, "Message Changed");
            super.onChange(selfChange);
            Log.i(TAG, "Message Changed after super");

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && moContext .checkCallingOrSelfPermission(Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED)
                   return;

            String[] laColumns = new String[]{"_id", "type", "address", "body", "date", "person"};
            Uri loUriAllMessages = Uri.parse("content://sms/");

            Cursor loCursor = moContext.getContentResolver().query(loUriAllMessages, laColumns, null, null, "_id DESC");

            if (loCursor != null) {
                if (loCursor.moveToFirst()) {
                    int liMessageId = loCursor.getInt(loCursor.getColumnIndex("_id"));
                    String lsType = loCursor.getString(loCursor.getColumnIndex("type")).trim();
                            //Doing my stuff here 
                 }
            }
            if (loCursor != null)
                loCursor.close();
      }
}

Это работает как шарм, как я сказал в большинстве устройств. но некоторые устройства не вызывали это, даже onChange не вызывал.

Я попробовал описанный ниже способ, но он не будет вызывать onChanged ни при каком сценарии.

private void registerMessageObserverSent() {
    String url = "content://sms/sent";
    Uri uri = Uri.parse(url);
    this.getApplicationContext()
            .getContentResolver()
                .registerContentObserver(uri, true, 
                         new MessageObserverSent(new Handler(), this));
}

private void registerMessageObserverOut() {
    String url = "content://sms/out";
        Uri uri = Uri.parse(url);
        this.getApplicationContext()
                .getContentResolver()
                    .registerContentObserver(uri, true,
                            new MessageObserverOut(new Handler(), this));
}

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

Может кто-нибудь помочь решить проблему с этими устройствами.

Приложение не подключено, поэтому нет проблем с политикой Play Store. это для моего личного использования.

...