Проблема
У меня первая мировая проблема, которую я хочу ускорить / устранить.Моя машина находится в закрытой парковке, и есть два ворот (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, делать такие вещи стало сложнее.
Заранее спасибо за помощь!