Приложение службы записи звонков не работает, не вводит условное «если», чтобы продолжить работу с диктофоном - PullRequest
0 голосов
/ 23 февраля 2020

Я делаю проект для записи входящих и исходящих звонков без вмешательства пользователя, то есть в Сервисе. Я новичок в программировании, так что ищите учебник, чтобы взять за основу. Поскольку учебник устарел и android имеет ограниченную безопасность, я внес некоторые изменения, такие как добавление прав администратора. До этого приложение было закрыто путем добавления разрешения, если вы входите в приложение, но ничего не записываете. Я ставлю «Тост» в качестве теста, чтобы увидеть, куда он не входит, и кажется, что он никогда не входит в следующий IF:

if(TelephonyManager.CALL_STATE_IDLE==state && rec==null) {
                        rec.stop();
                        rec.reset();
                        rec.release();
                        recorderstarted=false;
                        stopSelf();
                        Toast.makeText(getApplicationContext(), "IF", Toast.LENGTH_SHORT).show();
                    }else if(TelephonyManager.CALL_STATE_OFFHOOK==state){
                        try {
                            rec.prepare();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        rec.start();
                        recorderstarted=true;
                        Toast.makeText(getApplicationContext(), "ELSE IF", Toast.LENGTH_SHORT).show();
                    }

Манифест:

<?xml version="1.0" encoding="utf-8"?><manifest
xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.automaticcallrecorder">
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<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">
    <receiver
        android:name="com.example.automaticcallrecorder.DeviceAdminDemo"
        android:description="@string/ServcioDescripcion"
        android:label="deviceAdminLabel"
        android:permission="android.permission.BIND_DEVICE_ADMIN" >
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/my_admin" />


        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            <action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
            <action android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED" />
        </intent-filter>
    </receiver>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALLS"/>
            <action android:name="android.intent.action.PHONE_STATE"/>


            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>
    <service android:name=".RecordingService"></service>
</application>

MainActivity:

public class MainActivity extends AppCompatActivity {
    ToggleButton startandoff;
    private static final int REQUEST_CODE = 0;
    private DevicePolicyManager mDPM;
    private ComponentName mAdminName;


@Override
protected void onCreate(Bundle savedInstanceState) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.RECORD_AUDIO },
                10);
    } else {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startandoff=findViewById(R.id.ToggleButton2);
        try {
            // Initiate DevicePolicyManager.
            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
            mAdminName = new ComponentName(this, DeviceAdminDemo.class);

            if (!mDPM.isAdminActive(mAdminName)) {
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Click on Activate button to secure your application.");
                startActivityForResult(intent, REQUEST_CODE);
            } else {
                //mDPM.lockNow();
                //Intent intent = new Intent(MainActivity.this,
                //TrackDeviceService.class);
                //startService(intent);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


public void togglebutton(View view) {
    boolean checked = ((ToggleButton)view).isChecked();
    if(checked){
        Intent intent= new Intent(MainActivity.this,RecordingService.class);
        startService(intent);
        //Toast.makeText(getApplicationContext(),"1",Toast.LENGTH_SHORT).show();
    }else{
        Intent intent= new Intent(MainActivity.this,RecordingService.class);
        stopService(intent);
        Toast.makeText(getApplicationContext(),"2",Toast.LENGTH_SHORT).show();

    }
}

}

DeviceAdminDemo Class:

public class DeviceAdminDemo extends DeviceAdminReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    }

    public void onEnabled(Context context, Intent intent) {
    };

    public void onDisabled(Context context, Intent intent) {
    };
}

RecordingService:

public class RecordingService extends Service {
    private MediaRecorder rec;
    private boolean recorderstarted;
    private File file;
    String path="sdcard/alarms/";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, final int startId) {
        //return super.onStartCommand(intent, flags, startId);
        //Toast.makeText(getApplicationContext(),"777777777777777777777777",Toast.LENGTH_SHORT).show();
        Log.d(path,"e.e");
        file= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);
        Date date= new Date();
        CharSequence sdf = DateFormat.format("MM-dd-yy-hh-mm-ss",date.getTime());
        rec = new MediaRecorder();
        rec.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
        rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        rec.setOutputFile(file.getAbsolutePath()+"/"+"rec.3gp");
        rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        TelephonyManager manager = (TelephonyManager) getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE);
        manager.listen(new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String phoneNumber) {
                //super.onCallStateChanged(state, phoneNumber){

                    if(TelephonyManager.CALL_STATE_IDLE==state && rec==null) {
                        rec.stop();
                        rec.reset();
                        rec.release();
                        recorderstarted=false;
                        stopSelf();
                        Toast.makeText(getApplicationContext(), "IF", Toast.LENGTH_SHORT).show();
                    }else if(TelephonyManager.CALL_STATE_OFFHOOK==state){
                        try {
                            rec.prepare();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        rec.start();
                        recorderstarted=true;
                        Toast.makeText(getApplicationContext(), "ELSE IF", Toast.LENGTH_SHORT).show();
                    }
                Toast.makeText(getApplicationContext(), "FUERA", Toast.LENGTH_SHORT).show();
            }
        },PhoneStateListener.LISTEN_CALL_STATE);
        //Toast.makeText(getApplicationContext(),"5555555555555555555555",Toast.LENGTH_SHORT).show();
        return START_STICKY;
    } 
}

my_admin. xml:

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
    <uses-policies>
        <force-lock />
    </uses-policies>
</device-admin>
...