1

我想做一个通话记录备份和恢复应用程序。我做了一些初步的工作。喜欢打电话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;
}
}
4

0 回答 0