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





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

Немного подумав я понял, что достаточно написать небольшое приложение на 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 приложение для обратного звонка

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

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

*