2017-01-02 5 views
0

プロフィール画像を変更できるアプリを作成しようとしています。最初にアプリを開くと、現在のプロフィール写真のためのNetworkimageviewと画像を変更するボタンが含まれています。ボタンを押すと、ギャラリーから画像を選択してサーバーにアップロードできる新しいActivityが開始されます。Android:2番目のアクティビティのメソッドが正常に実行されて終了すると、メインアクティビティのメソッドを再読み込みします。

アップロードが完了すると、新しいActivityが閉じられ、アプリはMainActivityに戻ります。画像が新しいアクティビティから正常にアップロードされて閉じられると、サーバにアップロードされたばかりの画像をMainActivityに再ロードするにはどうすればよいですか?これは私のコード

はここMainActivity.java

public class MainActivity extends AppCompatActivity { 
    ImageLoader mImageLoader; 
    NetworkImageView mNetworkImageView; 
    private Button buttonChoose; 
    static final int PROFILE_PICTURE_REQUEST = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     buttonChoose = (Button) findViewById(R.id.buttonChoose); 

     mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView); 

     loadImage(); 
    } 

    private String url = "http://10.0.2.2/images/0.jpg"; 

    private void loadImage() { 
     mImageLoader = CustomVolleyRequest.getInstance(this).getImageLoader(); 
     mNetworkImageView.setImageUrl(url, mImageLoader); 
    } 

    public void newActivity(View view) { 
     Intent profileIntent = new Intent(this, Activity2.class); 
     startActivityForResult(profileIntent, PROFILE_PICTURE_REQUEST); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == PROFILE_PICTURE_REQUEST) { 
      if (resultCode == RESULT_OK) { 
       loadImage(); 
      } 
     } 
    } 
} 

二アクティビティActivity2.java

public class Activity2 extends AppCompatActivity implements View.OnClickListener { 
    private Bitmap bitmap; 
    private ImageView imageView; 
    private int PICK_IMAGE_REQUEST = 1; 
    private String UPLOAD_URL ="http://10.0.2.2/uploadd.php"; 
    private String KEY_IMAGE = "image"; 
    private Button buttonUpload; 

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

     imageView = (ImageView) findViewById(R.id.imageView); 
     buttonUpload = (Button) findViewById(R.id.buttonUpload); 
     buttonUpload.setOnClickListener(this); 

     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); 
    } 

    public String getStringImage(Bitmap bmp) { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
     byte[] imageBytes = baos.toByteArray(); 
     String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
     return encodedImage; 
    } 

    public void uploadImage() { 
     //Showing the progress dialog 
     final ProgressDialog loading = ProgressDialog.show(this, "Uploading...", "Please wait...", false, false); 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String s) { 
         loading.dismiss(); 
         Toast.makeText(Activity2.this, s, Toast.LENGTH_LONG).show(); 
         Intent returnIntent = new Intent(); 

         setResult(RESULT_OK,returnIntent); 
         finish(); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError volleyError) { 
         //Dismissing the progress dialog 
         loading.dismiss(); 
         //Showing toast 
         Toast.makeText(Activity2.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show(); 
        } 
       }) { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       //Converting Bitmap to String 
       String image = getStringImage(bitmap); 
       //Creating parameters 
       Map<String, String> params = new Hashtable<String, String>(); 
       //Adding parameters 
       params.put(KEY_IMAGE, image); 

       //returning parameters 
       return params; 
      } 
     }; 

     //Creating a Request Queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to the queue 
     requestQueue.add(stringRequest); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 
      Uri filePath = data.getData(); 
      try { 
       //Getting the Bitmap from Gallery 
       bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); 
       //Setting the Bitmap to ImageView 
       imageView.setImageBitmap(bitmap); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     if(v == buttonUpload){ 
      uploadImage(); 
     } 
    } 
} 
+0

startActivityForResultとonActivityResultを使用する基本的な設定が正しいです。アップロード後にURLが正しいと確信していますか?ブラウザで確認しましたか? –

+0

'loadImage()'は何をしますか? –

+0

サーバーがレスポンスとして新しいイメージのURLを返すようにします。 'SecondActivity'でこれを取得したら、' intAttribute'メソッドを通して 'MainActivity'に渡します。 'MainActivity'の' onActivityResult'でこのURLを取得できます。 'url'変数をこの新しいURLで更新し、' loadImage'メソッドを呼び出してください。 –

答えて

1

あなたが成功した画像のアップロードにActivity2を終えたら、あなたは、いくつかのエキストラを配置する必要がありますされますランチャーアクティビティに渡されるインテントはMainActivityです。

したがって、uploadImage()関数のonResponseセグメントは、次のようになります。 filePath変数をpublicと宣言して、ここでも使用できます。今

// Declare filePath as public 
Uri filePath; 

@Override 
public void onResponse(String s) { 
    loading.dismiss(); 
    Toast.makeText(Activity2.this, s, Toast.LENGTH_LONG).show(); 
    Intent returnIntent = new Intent(); 
    returnIntent.putExtra("UPDATED_PIC", filePath.toString()); 

    setResult(RESULT_OK,returnIntent); 
    finish(); 
} 

あなたMainActivityretuneIntentfilePathを取得し、そこからイメージをロードするように処理します。したがって、onActivityResultは次のようになります。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PROFILE_PICTURE_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      if(data != null) { 
       Uri filePath = Uri.parse(extras.getString("UPDATED_PIC")); 
       try { 
        //Getting the Bitmap from Gallery 
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); 
        // Setting the Bitmap to ImageView 
        mNetworkImageView.setImageBitmap(bitmap); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

returnIntent.putExtra( "UPDATED_PIC"、filePath.toString()はjava.lang.NullPointerExceptionを取得しています。 )) "@ Reaz Murshed –

+0

あなたは無効な' filePath'を持っています。前に述べたように、 'filePath'をグローバルとして宣言し、' returnIntent'に渡して後で使用する必要があります。 –

関連する問題