2016-12-08 7 views
0

私はアンドロイドの携帯電話から連絡先を取得しています。そして、配列としてPHPにデータを送信し、結果をループして代わりに最後の連絡先を見つけます。どのように私は全体の配列を投稿することができます上の任意の提案。ここでAndroidはPHPのフル配列を投稿します

は私の現在のコード

public class MainActivity extends AppCompatActivity { 

    ArrayList alContacts; 
    ArrayList alNumbers; 
    Button button; 
    EditText Name,Email; 
    Map<String,String> param; 
    ListView lv; 
    Cursor cr; 
    String URL ="http://192.168.0.10/oap/home/synchcontacts"; 
    AlertDialog.Builder builder; 

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

     button = (Button) findViewById(R.id.save); 
     Name= (EditText) findViewById(R.id.name); 
     Email = (EditText) findViewById(R.id.email); 
     builder = new AlertDialog.Builder(this); 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // getDetails(); 
       final String name,email; 
       name = Name.getText().toString(); 
       email = Email.getText().toString(); 

       StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         builder.setTitle("Server Title"); 
         builder.setMessage(response); 
         builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 

          } 
         }); 
         AlertDialog bu = builder.create(); 
         bu.show(); 
        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(MainActivity.this, "Error",Toast.LENGTH_SHORT).show(); 
         error.printStackTrace(); 
        } 
       }){ 
        @Override 
        protected Map<String,String> getParams() throws AuthFailureError { 

         ContentResolver cr = getContentResolver(); //Activity/Application android.content.Context 
         Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
         if(cursor.moveToFirst()) 
         { 
          alContacts = new ArrayList<String>(); 
          alNumbers = new ArrayList<String>(); 
          do 
          { 
           String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
           String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

           if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
           { 
            Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ id }, null); 
            while (pCur.moveToNext()) 
            { 
             String contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

             alContacts.add(name); 
             alNumbers.add(contactNumber); 

             break; 
            } 
            pCur.close(); 
           } 


          } while (cursor.moveToNext()) ; 
          List<NameValuePair> param = new ArrayList<NameValuePair>(); 
          Gson gson = new GsonBuilder().create(); 
          JsonArray myContacts = gson.toJsonTree(alContacts).getAsJsonArray(); 
          JsonArray myNumbers = gson.toJsonTree(alNumbers).getAsJsonArray(); 
          for (int i=0; i<myContacts.size();i++){ 
           param.add(new BasicNameValuePair("name[]",myContacts.get(i).toString())); 
           param.add(new BasicNameValuePair("phone[]",myNumbers.get(i).toString())); 

          } 
          Log.i("PARAM",param.toString()); 
         } 

         return param; 

        } 
       }; 
       MySingleton.getInstance(MainActivity.this).addToRequestQueue(stringRequest); 

      } 
     }); 


    } 

} 

あなたの問題はあなたが値を渡すためにHashMapを使用していることであるPHP

function SynchContacts() { 

     $phone = $this->input->post('phone'); 
     $name = $this->input->post('name');  


     for ($i = 0; $i < count($phone); $i++) { 
      $data = array(
       'name' => $name[$i], 
       'phone' => $phone[$i] 
      ); 
      $this->saveData('phonebook', $data); 
     } 
    } 

答えて

0

です。そして、あなたが最後の値だけを格納しているhashMapでは、同じidを持つ2つのアイテムを持つことができないからです。

リストのようなものを内部的に使用し、その要求をレンダリングしたい場合があります。 (org.apache.http.NameValuePair)などの項目で例えば

List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); 
    urlParameters.add(new BasicNameValuePair("id[]", "id1")); 
    urlParameters.add(new BasicNameValuePair("id[]", "id2")); 
    .... 

だから、だろう、あなたの場合:

 .... 
     List<NameValuePair> param = new ArrayList<NameValuePair>(); 
     Gson gson = new GsonBuilder().create(); 
     JsonArray myContacts = gson.toJsonTree(alContacts).getAsJsonArray(); 
     JsonArray myNumbers = gson.toJsonTree(alNumbers).getAsJsonArray(); 
     for (int i=0; i<myContacts.size();i++){ 
      param.add(new BasicNameValuePair("name[]",myContacts.get(i).toString())); 
      param.add(new BasicNameValuePair("phone[]",myNumbers.get(i).toString())); 
     } 

     return param; 

EDIT:

は後に思えますスニペット全体を見ると、使用しているライブラリによって制限されているようです。私は、あなたが以下のリンクで答えを見つけるだろう、と思う:ここ

Google Volley request with duplicate parameter names

または:

https://groups.google.com/forum/#!topic/volley-users/tFRclnEbpAk

+0

@Valdimir iはリストにハッシュマップを置き換えますどのようにあなたの提案を使用して、共有をありがとうサーバーに送信される最終出力を返します – Alphy

+0

@Alphy私はあなたのコードスニペットのように見えるように私の例を更新しました。後でparamを使用するコードを変更する方法は、共有スナップセットの一部ではないので、私は言うことができません。 –

+0

@Valdimirスナップショットを完全なコードに更新しました。ログから、配列を作成しているのが分かりますが、戻り値は現在、List を使用しています保護されたマップを変更する getParams()はAuthFailureErrorをスローします{更新を参照していますか? – Alphy

関連する問題