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