2017-07-02 11 views
0

次のコードは、連絡先をvcfファイルとしてバックアップするために使用します。 これはapi 23以下のデバイスでうまく動作しますが、上位のapiではjava.lang.NegativeArraySizeException:-1を取得します。どんな考え? おかげでここAndroid java.lang.NegativeArraySizeException:-1

は完全なコードおよびエラーログです

private void getVcardString() throws IOException { 
      // TODO Auto-generated method stub 
      //ProgressBar pro = (ProgressBar)findViewById(R.id.pb); 
      try { 


      // ProgressBar pro = (ProgressBar) findViewById(R.id.pb1); 
      vCard = new ArrayList<String>(); // Its global.... 
      cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1", 
        null, null, null); 
      if (cursor != null && cursor.getCount() > 0) { 
       int i; 
       String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile; 
       FileOutputStream mFileOutputStream = new FileOutputStream(storage_path, false); 
       cursor.moveToFirst(); 
       for (i = 0; i < cursor.getCount(); i++) { 

        get(cursor); 
        Log.d("TAG", "Contact " + (i + 1) + "VcF String is" + vCard.get(i)); 
        cursor.moveToNext(); 

        mFileOutputStream.write(vCard.get(i).toString().getBytes()); 
       } 
       mFileOutputStream.close(); 
       cursor.close(); 
       new Handler(Looper.getMainLooper()).post(new Runnable() { 
        @Override 
        public void run() { 
         tx.setText(""); 
         pro.setVisibility(View.GONE); 
         btn3.setVisibility(View.VISIBLE); 
         tx1.setVisibility(View.VISIBLE); 
         Toast toast = Toast.makeText(getApplicationContext(), R.string.backupdone, Toast.LENGTH_SHORT); 
         toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 90); 
         toast.show(); 

        } 
       }); 




      } else { 
       Log.d("TAG", "No Contacts in Your Phone"); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
      }} 

     private void get(Cursor cursor2) { 
      String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); 
      Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); 
      AssetFileDescriptor fd; 
      try { 
       fd = 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); 

      } catch (Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

    }); 

エラーログ

07-03 00:20:55.796 9500-10477/com.HEbackup W/System.err: 
java.lang.NegativeArraySizeException: -1 
07-03 00:20:55.796 9500-10477/com.HEbackup W/System.err:  at 
app.HEbackup.cbackup$1.get(cbackup.java:212) 
07-03 00:20:55.796 9500-10477/com.HEbackup W/System.err:  at 
app.HEbackup.cbackup$1.getVcardString(cbackup.java:172) 
07-03 00:20:55.796 9500-10477/com.HEbackup W/System.err:  at 
app.HEbackup.cbackup$1.access$000(cbackup.java:120) 
07-03 00:20:55.797 9500-10477/com.HEbackup W/System.err:  at 
app.HEbackup.cbackup$1$1.run(cbackup.java:144) 
07-03 00:20:55.797 9500-10477/com.HEbackup W/System.err:  at 
java.lang.Thread.run(Thread.java:761) 

答えて

2

fd.getDeclaredLength()アレイを作成するために使用しようと戻っ-1、。負の長さの配列は存在しないので、NegativeArraySizeExceptionが得られます。

指定資産がBufferedReader(及びInputStreamReader)が正解であろうStringにコンテンツ変換を読み出す処理するために使用して所定の長さを有していないようですので。

+0

私は文字列に変換する必要がありますか? –

0
FileInputStream fis = new FileInputStream(fd.getFileDescriptor()); 
    byte[] buf = new byte[fis.available()]; 
    fis.read(buf); 
    String vcardstring = new String(buf); 
    vCard.add(vcardstring); 
+0

あなたの答えを編集して、Askerのバージョンとはまったく異なるものを記述してください。コードのみの回答は貧弱な習慣です。 – Jon

関連する問題