Пишем приложение для автодозвона





Недавно на мобильный телефон одного моего близкого родственника начали поступать телефонные звонки с неизвестных мобильных номеров, при этом если принять входящий звонок, то в трубке просто-напросто молчали. На наши вопросы на другом конце «провода» никто не отвечал. По началу я думал, что это кто-то ошибся номером, но когда стали поступать «пустые» звонки с различных мобильных номеров я понял, что звонят не живые люди, а скорее всего это делает какая-то программа. И вот мне стало интересно и я задался вопросом — а собственно как это можно реализовать с помощью какой-нибудь программы?

Немного подумав я понял, что достаточно написать небольшое приложение на java для android, алгоритм, которого заключается в следующем:

1) программа должна иметь таймер, назовём его таймер1 по которому после старта осуществляется звонок на определённый мобильный номер;

2) также будет в этом приложении кнопка button и второй таймер — таймер2, который будет отсчитывать время исходящего вызова и после истечения интервала, исходящий вызов будет закончен.

Да и ещё понадобится одна библиотека ITelephony (эту библиотеку нужно положить в папку myapplication) для работы с методом endCall. Именно этот метод будет автоматически заканчивать (прерывать) исходящий вызов.

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

И вот, что получилось:

IDE — Android Studio

Эмулятор — Genymotion

package com.example.admin.myapplication;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.content.Intent;
import android.net.Uri;
import android.view.View.OnClickListener;
import android.os.CountDownTimer;
import java.lang.reflect.Method;
import android.content.Context;
import android.telephony.TelephonyManager;
import com.android.internal.telephony.ITelephony;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;


public class MainActivity extends AppCompatActivity {
private Button button;

private GoogleApiClient client;

private void endCall() {
    Context context = getApplicationContext();
    try {
        TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        Class<?> c = Class.forName(telephony.getClass().getName());

        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);

        ITelephony telephonyService = (ITelephony) m.invoke(telephony);

        
        telephonyService.endCall();

        //logManager.debug("ITelepony was used (endCall)");
    } catch (Exception e) {
        // logManager.error("Error ending call: " + e.getMessage());
        //logManager.debug("Error ending call", e);
    }
}


int i = 5000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    final TextView mTextField = (TextView) findViewById(R.id.textView);
    button = (Button) findViewById(R.id.buttonCall);





    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg1) {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:89031234567"));
            startActivity(callIntent);

            new CountDownTimer(i, 1000) {

              public void onTick(long millisUntilFinished) {
                   mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
                }



                public void onFinish() {


                    endCall();
                    mTextField.setText("Вызов закончен!");

                }
            }.start();
        }
    });

    new CountDownTimer(i, 1000) {

        public void onTick(long millisUntilFinished) {
            mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
        }

        public void run() {
            button.performClick();

        }
        public void onFinish() {

            run();



        }
    }.start();


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
    // ATTENTION: This was auto-generated to implement the App Indexing API.
    // See https://g.co/AppIndexing/AndroidStudio for more information.
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onStart() {
    super.onStart();

    // ATTENTION: This was auto-generated to implement the App Indexing API.
    // See https://g.co/AppIndexing/AndroidStudio for more information.
    client.connect();
    Action viewAction = Action.newAction(
            Action.TYPE_VIEW, // TODO: choose an action type.
            "Main Page", // TODO: Define a title for the content shown.
            // TODO: If you have web page content that matches this app activity's content,
            // make sure this auto-generated web page URL is correct.
            // Otherwise, set the URL to null.
            Uri.parse("http://host/path"),
            // TODO: Make sure this auto-generated app deep link URI is correct.
            Uri.parse("android-app://com.example.garasov.myapplication/http/host/path")
    );
    AppIndex.AppIndexApi.start(client, viewAction);
}

@Override
public void onStop() {
    super.onStop();

    // ATTENTION: This was auto-generated to implement the App Indexing API.
    // See https://g.co/AppIndexing/AndroidStudio for more information.
    Action viewAction = Action.newAction(
            Action.TYPE_VIEW, // TODO: choose an action type.
            "Main Page", // TODO: Define a title for the content shown.
            // TODO: If you have web page content that matches this app activity's content,
            // make sure this auto-generated web page URL is correct.
            // Otherwise, set the URL to null.
            Uri.parse("http://host/path"),
            // TODO: Make sure this auto-generated app deep link URI is correct.
            Uri.parse("android-app://com.example.garasov.myapplication/http/host/path")
    );
    AppIndex.AppIndexApi.end(client, viewAction);
    client.disconnect();
}
}

файл content_main.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.garasov.myapplication.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:text="Hello World!" />
    <Button
        android:id="@+id/buttonCall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="call 89031234567"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="218dp" />


</RelativeLayout>

файл AndroidManifest.xml выглядит вот так:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.garasov.myapplication">

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- ATTENTION: This was auto-generated to add Google Play services to your project for
             App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>
    <receiver android:name=".PhoneStateReceiver">
        <intent-filter android:priority="0">
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>
</manifest>

Читайте также — Android приложение для обратного звонка

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*