Я пытаюсь создать приложение, которое на самом деле меняет режим звонка на нормальный после обнаружения входящего вызова. В чем проблема с моим кодом? - PullRequest
0 голосов
/ 23 марта 2020

Я пробовал два разных кода для него, используя и широковещательный приемник, и просто используя метод OnCallStateChange внутри основной активности, но оба они не работают, он не обнаруживает звонки и не устанавливает режимы звонка. Я новичок в android разработке, и целью является школьный проект. Он должен даже предоставлять функции вызова, который функционирует хорошо. Ниже приведены мои коды: Файл манифеста:

'''<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.emergica">
   <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
    <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <application
        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/AppTheme">
        <activity android:name="com.example.emergica.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>'''

MainActivity. java:

package com.example.emergica;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;


import android.Manifest;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;

import android.media.AudioManager;
import android.net.Uri;

import android.telephony.PhoneStateListener;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.view.View;

import android.os.Bundle;
import android.widget.Button;

import android.widget.EditText;


public class MainActivity extends AppCompatActivity {

    private Button button;
    EditText txtphoneNo;
    String phoneNo;
    String message = "Please pick my call";
    int state=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txtphoneNo = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Call();
            }


        });
      /*  openPhoneStateReceiver();*/
        TelephonyManager telephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

        PhoneStateListener callStateListener=new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String phoneNumber) {
               // super.onCallStateChanged(state, phoneNumber);

                if (state==TelephonyManager.CALL_STATE_RINGING)
                {
                    System.out.println("phone ringing");//here it doesn't display anything in the terminal
                    AudioManager audioManager=(AudioManager)getBaseContext().getSystemService(Context.AUDIO_SERVICE);
                    audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    audioManager.setStreamVolume(AudioManager.STREAM_RING,audioManager.getStreamMaxVolume(AudioManager.STREAM_RING),0);
                    String incomingNumber=phoneNumber;
                }
            }
        };
        telephonyManager.listen(callStateListener,PhoneStateListener.LISTEN_CALL_STATE);



    }


   private void Call() {
        phoneNo = txtphoneNo.getText().toString();
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:" + phoneNo));
        SmsManager.getDefault().sendTextMessage(phoneNo, null, message, null, null);
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        startActivity(callIntent);


    }

   /* public void openPhoneStateReceiver() {
        Intent intent = new Intent(MainActivity.this, PhoneStateReceiver.class);
        startActivity(intent);
    }*/

}

Далее я также попробовал метод приемника вещания PhoneStateReceiver. java:

package com.example.emergica;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.telephony.TelephonyManager;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class PhoneStateReceiver extends BroadcastReceiver  {
    AudioManager audioManager=(AudioManager)getBaseContext().getSystemService(Context.AUDIO_SERVICE);
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            System.out.println("Phone ringing");
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                Toast.makeText(context, "Incoming Call State", Toast.LENGTH_SHORT).show();
                if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
                    audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

В этом методе любой метод getBaseContext () выдавал ошибку, поскольку он не может быть использован внутри широковещательного приемника, и более того, я не знаю, как вызвать это новое действие из основного действия, как при попытке снова вызвать ошибку и в этот раз в моей основной деятельности были только обычные строки кода и код, поддерживающий другие функции моего приложения, и поэтому я переключился на первый метод, используя метод OnCallStateChange (). Но нет никаких признаков изменения состояния или обнаружения входящего вызова. Все остальные функции приложения работают хорошо. Пожалуйста, выберите мою ошибку, приложение My android работает на уровне API 15, а уровень API эмулятора - 29 (Q) и работает на последней версии android studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...