由於我是Java新手,我自己創建了這些代碼,並從其他來源獲取了一些部分。我想將所有聯繫人信息備份到主存儲或SD卡中的.vcf文件中(無所謂),最後將其恢復。但在這個代碼,你只能看到備份的部分:將聯繫人備份到.VCF文件不起作用
public class MainActivity extends Activity
{
Cursor cursor;
ArrayList<String> vCard ;
String vfile;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vfile = "Contacts" + "_" + System.currentTimeMillis()+".vcf";
getVcardString();
}
private void getVcardString() {
vCard = new ArrayList<String>();
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if(cursor!=null&&cursor.getCount()>0)
{
cursor.moveToFirst();
for(int i =0;i<cursor.getCount();i++)
{
get(cursor);
Log.d("TAG", "Contact "+(i+1)+"VcF String is"+vCard.get(i));
cursor.moveToNext();
}
}
else
{
Log.d("TAG", "No Contacts in Your Phone");
}
}
public void get(Cursor cursor)
{
String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd;
try {
fd = this.getContentResolver().openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();
byte[] buf = new byte[(int) fd.getDeclaredLength()];
fis.read(buf);
String vcardstring= new String(buf);
vCard.add(vcardstring);
String storage_path = Environment.getRootDirectory().toString() + File.separator + vfile;
FileOutputStream mFileOutputStream = new FileOutputStream(storage_path, false);
mFileOutputStream.write(vcardstring.toString().getBytes());
} catch (Exception e1)
{
e1.printStackTrace();
}
}
}
問題是代碼不工作,沒有得到異常或任何錯誤。我搜索了根目錄和所有文件夾,但沒有.vcf文件。我的權限是:<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />
我在API 17和24上運行了這個任何想法,爲什麼它不起作用?
要獲得SD卡路徑,您必須使用Environment.getExternalStorageDirectory() Environment.getRootDirectory()返回設備根目錄「/」 - 您無法在此目錄中寫入(或讀取)非根-設備。 –
你還採用了寫入外部存儲權限嗎? –
@kapsym嗯,我不知道我應該使用該權限,但我的優先級是將該文件保存在設備的存儲中。如果Environment.getRootDirectory()不起作用,那麼我應該如何將它保存在設備內存上? (不是外部存儲器) – Magasvazn