Как сохранить историю звонков в памяти телефона? Как в качестве резервной копии - PullRequest
1 голос
/ 29 мая 2019

Я хочу сделать журнал звонков для резервного копирования и восстановления приложений.Я сделал некоторую начальную работу.как позвонить CallLog API и показать в ListView.но теперь как можно сохранить во внутреннем или внешнем хранилище. после этого мы можем восстановить эту историю вызовов через файл резервной копии этих данных.

введите описание изображения здесь введите код здесь введите описание изображения здесь

public class Backup_Activity extends AppCompatActivity {

private static final int READ_LOGS = 725;
private ListView logList;
private Runnable logsRunnable;
private String[] requiredPermissions = {Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_CONTACTS};



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


    logList = findViewById(R.id.listview_id);


    logsRunnable = new Runnable() {
        @Override
        public void run() {
            loadLogs();
        }
    };


    // Checking for permissions
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        checkPermissionToExecute(requiredPermissions, READ_LOGS, logsRunnable);
    } else {
        logsRunnable.run();
    }


}

// This is to be run only when READ_CONTACTS and READ_CALL_LOG permission are granted
private void loadLogs() {
    LogsManager logsManager = new LogsManager(this);
    List<LogObject> callLogs = logsManager.getLogs(LogsManager.ALL_CALLS);

    LogsAdapter logsAdapter = new LogsAdapter(Backup_Activity.this, R.layout.log_layout, callLogs);
    logList.setAdapter(logsAdapter);


}

// A method to check if a permission is granted then execute tasks depending on that particular permission
@TargetApi(Build.VERSION_CODES.M)
private void checkPermissionToExecute(String permissions[], int requestCode, Runnable runnable) {

    boolean logs = ContextCompat.checkSelfPermission(this, permissions[0]) != PackageManager.PERMISSION_GRANTED;
    boolean contacts = ContextCompat.checkSelfPermission(this, permissions[1]) != PackageManager.PERMISSION_GRANTED;

    if (logs || contacts) {
        requestPermissions(permissions, requestCode);
    } else {
        // runnable.run();
    }

}

@Override
@TargetApi(Build.VERSION_CODES.M)
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == READ_LOGS && permissions[0].equals(Manifest.permission.READ_CALL_LOG) && permissions[1].equals(Manifest.permission.READ_CONTACTS)) {
        if (grantResults[0] == PermissionChecker.PERMISSION_GRANTED && grantResults[1] == PermissionChecker.PERMISSION_GRANTED) {
            logsRunnable.run();
        } else {
            new AlertDialog.Builder(Backup_Activity.this)
                    .setMessage("The app needs these permissions to work, Exit?")
                    .setTitle("Permission Denied")
                    .setCancelable(false)
                    .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            checkPermissionToExecute(requiredPermissions, READ_LOGS, logsRunnable);
                        }
                    })
                    .setNegativeButton("Exit App", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                            finish();
                        }
                    }).show();
        }
    }

}


public void backup(View view) {

    LogsManager logsManager = new LogsManager(this);
    List<LogObject> callLogs = logsManager.getLogs(LogsManager.ALL_CALLS);
    LogsAdapter logsAdapter = new LogsAdapter(Backup_Activity.this, R.layout.log_layout, callLogs);


                    File sdcard = Environment.getExternalStorageDirectory();
                    File dir = new File(sdcard.getAbsolutePath() + "/text/");
                    dir.mkdir();
                    File file = new File(dir, "back up calls log.VCF");
                    FileOutputStream os = null;
                    try {
                        os = new FileOutputStream(file);
                        os.write(logsAdapter.toString().getBytes());
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();}
                    }}







class LogsAdapter extends ArrayAdapter<LogObject> {

List<LogObject> logs;
Context context;
int resource;

public LogsAdapter(Context context, int resource, List<LogObject> callLogs) {
    super(context, resource, callLogs);
    this.logs = callLogs;
    this.context = context;
    this.resource = resource;

}

@Override
public Context getContext() {
    return context;
}

@Override
public int getCount() {
    return logs.size();
}

@Override
public LogObject getItem(int position) {
    return logs.get(position);
}

@Override
@SuppressLint("ViewHolder")
@RequiresPermission(Manifest.permission.READ_CONTACTS)

public View getView(int position, View convertView, ViewGroup parent) {
    View row = LayoutInflater.from(getContext()).inflate(resource, parent, false);

    TextView phone = (TextView) row.findViewById(R.id.number_id);
    TextView name=row.findViewById(R.id.name_id);
    TextView duration = (TextView) row.findViewById(R.id.call_duration);
    TextView date = (TextView) row.findViewById(R.id.call_time);
   // ImageView profileView=row.findViewById(R.id.profile_id);
    ImageView imageView = (ImageView) row.findViewById(R.id.calls_image_id);


    LogObject log = getItem(position);
    Date date1 = new Date(log.getDate());

    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.ERA_FIELD, DateFormat.SHORT);


    name.setText(log.getContactName());
    phone.setText(log.getNumber());
    duration.setText(log.getCoolDuration());
    date.setText(dateFormat.format(date1));
   // profileView.setImageResource(log.getDuration());

    switch (log.getType()) {

        case LogsManager.INCOMING:
            imageView.setImageResource(R.drawable.received);
            break;
        case LogsManager.OUTGOING:
            imageView.setImageResource(R.drawable.sent);
            break;
        case LogsManager.MISSED:
            imageView.setImageResource(R.drawable.missed);
            break;
        default:
            imageView.setImageResource(R.drawable.cancelled);
            break;

    }


    return row;
}
}
...