Звоните и отслеживайте исходящие звонки в Android - PullRequest
0 голосов
/ 04 октября 2018

Проблема

У меня первая мировая проблема, которую я хочу ускорить / устранить.Моя машина находится в закрытой парковке, и есть два ворот (1 вход с ключом для пешеходов и 1 ворота для въезда / выезда автомобилей).Ворота автомобиля открываются путем вызова определенного телефонного номера.

Текущий процесс

Я звоню на определенный номер (который распознает мой номер в качестве действительного клиента, чтобы открыть ворота), и как только телефон ответит, ворота открываются.

Предлагаемое решение

Приложение, которое вызывает указанный номер при загрузке и сразу после выходана вызов ответили с другой стороны (возможно, подождите 1 секунду);повесить трубку.

Прогресс на сегодняшний день

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

Код

// Манифест

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

// Основная деятельность

public class MainActivity extends AppCompatActivity {

private MyPhoneCallListener mListener;
TelephonyManager mTelephonyManager;

private static final int MY_REQUIRED_PERMISSIONS = 1;

TextView textview;

String phoneNumber = "tel: 5554"; // Calling an AVD for testing

private void makeCall(){
    // Permission was granted.
    textview.setText(textview.getText() + "\nPermissions Granted.");

    // Register the PhoneStateListener to monitor phone activity.
    mListener = new MyPhoneCallListener();
    mTelephonyManager.listen(mListener,
            PhoneStateListener.LISTEN_CALL_STATE);

    // Create the intent.
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    // Set the data for the intent as the phone number.
    callIntent.setData(Uri.parse(phoneNumber));
    // If package resolves to an app, check for phone permission,
    // and send intent.
    if (callIntent.resolveActivity(getPackageManager()) != null) {
        startActivity(callIntent);
    } else {
        Log.e("shane-", "Can't resolve app for ACTION_CALL Intent.");
    }
}

private boolean isTelephonyEnabled() {
    if (mTelephonyManager != null) {
        if (mTelephonyManager.getSimState() ==
                TelephonyManager.SIM_STATE_READY) {
            return true;
        }
    }
    return false;
}

private boolean checkForPhonePermission() {

    boolean permissionsGranted = false;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED
                || checkSelfPermission(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_DENIED
                || checkSelfPermission(Manifest.permission.PROCESS_OUTGOING_CALLS) == PackageManager.PERMISSION_DENIED) {
            String[] permissions = {
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.CALL_PHONE,
                    Manifest.permission.PROCESS_OUTGOING_CALLS
            };
            requestPermissions(permissions, MY_REQUIRED_PERMISSIONS);
        } else {
            permissionsGranted = true;
        }
    }

    return permissionsGranted;
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    Log.d("shane-", Integer.toString(grantResults[0]));

    switch (requestCode) {
        case MY_REQUIRED_PERMISSIONS: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                makeCall();
            } else {
                // Permission denied. Stop the app.
                Log.d("shane-", "Permission was denied");
                textview.setText(textview.getText() + "\nYou have denied the required permissions for this app to work.");
            }
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textview = (TextView) findViewById(R.id.tv);

    // Create a telephony manager.
    mTelephonyManager = (TelephonyManager)
            getSystemService(TELEPHONY_SERVICE);

    if (isTelephonyEnabled()) {
        Log.d("shane-", "Telephony Enabled");
        textview.setText(textview.getText() + "\nTelephony enabled");
        Toast.makeText(this,
                "Telephony is enabled :)",
                Toast.LENGTH_LONG).show();

        // Check for phone permission.
        if(checkForPhonePermission()){
            makeCall();
        }

     // else telephony not enabled
    } else {
        Log.d("shane-", "Telephony not enabled :(");
        textview.setText(textview.getText() + "\nTelephony not enalbed");
    }

}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (isTelephonyEnabled()) {
        mTelephonyManager.listen(mListener,
                PhoneStateListener.LISTEN_NONE);
    }
}


}

// MyPhoneListener.java

class MyPhoneCallListener extends PhoneStateListener {

private String LOG_TAG = "shane-phonelistener";
private boolean wasRinging;

@Override
public void onCallStateChanged(int state, String incomingNumber) {
    Log.i(LOG_TAG, Integer.toString(state));
    switch(state){
        case TelephonyManager.CALL_STATE_RINGING:
            Log.i(LOG_TAG, "RINGING");
            wasRinging = true;
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            Log.i(LOG_TAG, "OFFHOOK");

            if (!wasRinging) {
                // Start your new activity
            } else {
                // they answered the call
                // Cancel your old activity
                Log.i(LOG_TAG, "ANSWERED THE CALL"); // never gets hit
            }

            // this should be the last piece of code before the break
            wasRinging = true;
            break;
        case TelephonyManager.CALL_STATE_IDLE:
            Log.i(LOG_TAG, "IDLE");
            if (wasRinging) {
                // Call was rejected
                Log.i(LOG_TAG, "REJECTED THE CALL");
            }
            // this should be the last piece of code before the break
            wasRinging = false;
            break;
        }
    }
}

Извиняюсь за беспорядок, я честно думал, что это будет легко;но появляется после Android 23, делать такие вещи стало сложнее.

Заранее спасибо за помощь!

...