2016-01-02 5 views
5

私はアプリ内でプロフィール画像の変更を実装する方法の例を見つけるために高低を検索してきました。私はPersonがParse.comを使ってプロフィール画像を追加/変更できるようにしたいと思っています(今日のすべてのソーシャルメディアアプリに似ています)。プロフィール写真のアップロード/変更を可能にするアプリケーションを作成するには?

たとえば、 Twitter、Facebook、Instagramなど、それらはすべてプロフィール画像を撮影/アップロードすることができ、その画像は保存され、後で見ることができます。

私はそのようなことを行う方法について説明した任意の材料を見つけるの運を持っていないと誰が私がここで達成しようとしているものを理解しているようだ:

An Image Downloaded From Parse Stay On Screen Even After You Exit And Reopen App?

をこれまでのところ私のアプリにユーザは、カメラの意図で写真を撮ることができ、またはギャラリーから画像をアップロードすることができ、その画像は完全に画像ビューで表示される。

問題があります:私が終了し、アプリケーションを再オープンすると、イメージビュー内のイメージが表示されなくなりました(消えています)。

どうすればこの問題を解決できますか?

MainActivity:

 public class MainActivity extends AppCompatActivity { 

     public static final int TAKE_PIC_REQUEST_CODE = 0; 
     public static final int CHOOSE_PIC_REQUEST_CODE = 1; 
     public static final int MEDIA_TYPE_IMAGE = 2; 

     private Uri mMediaUri; 

     private TextView mChangeProfilePic; 
     protected ImageView mPreviewImageView; 
     private Button mSaveChangesBtn; 
     public ImageView mProfilePic; 


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


      FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
      fab.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
          .setAction("Action", null).show(); 
       } 
      }); 


      //Initialize variables 
      mChangeProfilePic = (TextView) findViewById(R.id.changeProfileImageTxt); 
      mPreviewImageView = (ImageView) findViewById(R.id.profileImage); 
      mSaveChangesBtn = (Button) findViewById(R.id.saveProfileChangesBtn); 
      mSaveChangesBtn.setEnabled(false); 

      final Button mNextBtn = (Button) findViewById(R.id.NextBtn); 
      mNextBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent intentNext = new Intent(MainActivity.this, SecondActivity.class); 
        startActivity(intentNext); 
       } 
      }); 


      //Change profile image 
      //set onlClick to TextView 
      mChangeProfilePic.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getApplicationContext(), "Change Pic Pressed", Toast.LENGTH_SHORT).show(); 

        //show dialog 
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
        builder.setTitle("Upload or Take a photo"); 
        builder.setPositiveButton("Upload", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          //upload image 
          Intent choosePictureIntent = new Intent(Intent.ACTION_GET_CONTENT); 
          choosePictureIntent.setType("image/*"); 
          startActivityForResult(choosePictureIntent, CHOOSE_PIC_REQUEST_CODE); 

          mSaveChangesBtn.setEnabled(true); 

         } 
        }); 
        builder.setNegativeButton("Take Photo", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          //take photo 
          Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
          mMediaUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
          if (mMediaUri == null) { 
           //display error 
           Toast.makeText(getApplicationContext(), "Sorry there was an error! Try again.", Toast.LENGTH_LONG).show(); 

           mSaveChangesBtn.setEnabled(false); 

          } else { 
           takePicture.putExtra(MediaStore.EXTRA_OUTPUT, mMediaUri); 
           startActivityForResult(takePicture, TAKE_PIC_REQUEST_CODE); 

           mSaveChangesBtn.setEnabled(true); 
          } 
         } 
        }); 
        AlertDialog dialog = builder.create(); 
        dialog.show(); 
       } 
      });//End change profile image onClick Listener 


      //Save profile changes button 
      //Also uploads content to parse and pulls it back same time 
      mSaveChangesBtn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        //create parse object for image to upload 
        final ParseObject imageUpload = new ParseObject("ImageUploads"); 
        try { 
         //convert image to bytes for upload. 
         byte[] fileBytes = FileHelper.getByteArrayFromFile(MainActivity.this, mMediaUri); 
         if (fileBytes == null) { 
          //there was an error 
          Toast.makeText(getApplicationContext(), "There was an error. Try again!", Toast.LENGTH_LONG).show(); 

          mSaveChangesBtn.setEnabled(false); 
         } else { 

          fileBytes = FileHelper.reduceImageForUpload(fileBytes); 
          String fileName = FileHelper.getFileName(MainActivity.this, mMediaUri, "image"); 
          final ParseFile file = new ParseFile(fileName, fileBytes); 
          imageUpload.saveEventually(new SaveCallback() { 
           @Override 
           public void done(ParseException e) { 
            if (e == null) { 

             imageUpload.put("imageContent", file); 
             imageUpload.saveInBackground(new SaveCallback() { 
                     @Override 
                     public void done(ParseException e) { 
                      Toast.makeText(getApplicationContext(), "Success Uploading iMage!", Toast.LENGTH_LONG).show(); 

                      //Retrieve the recently saved image from Parse 
                      queryParseProfileImages(imageUpload); 

                      mSaveChangesBtn.setEnabled(false); 
                     } 
                    } 

             ); 
            } else { 
             //there was an error 
             Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 

             mSaveChangesBtn.setEnabled(false); 
            } 
           } 
          }); 

         } 

        } catch (Exception e1) { 
         Toast.makeText(getApplicationContext(), e1.getMessage(), Toast.LENGTH_LONG).show(); 
        } 
       }//End onClick(View v) 

      });//End onClick Listener 


//This method queries for the most recent picture taken 
ParseQuery<ParseObject> imagesQuery = new ParseQuery<>("ImageUploads"); 
      imagesQuery.orderByDescending("createdAt"); 
      imagesQuery.findInBackground(new FindCallback<ParseObject>() { 
       @Override 
       public void done(List<ParseObject> images, ParseException e) { 
        if(e == null){ 

         //for (int i = 0; i < images.size(); i++) { 

          final String imgUrl = images.get(0).getParseFile("imageContent").getUrl(); 


          mProfilePic = (ImageView) findViewById(R.id.profileImage); 
          Picasso.with(MainActivity.this).load(imgUrl).into(mProfilePic); 

         //} 
         //images.pinInBackground(); 

         //profileImageId = profImgObj.getObjectId(); 
         //Log.d(TAG, "The object id is: " + profileImageId); 
        }else{ 
         Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 



     }//End onCreate 


     //Method containing ParseQuery to download/pull back the image that was uploaded to Parse 
     //Inside the Image View 
     private void queryParseProfileImages(final ParseObject imageUploadPassed) { 

      ParseFile userImageRetrievedObj = (ParseFile) imageUploadPassed.get("imageContent"); 
      userImageRetrievedObj.getDataInBackground(new GetDataCallback() { 
       public void done(byte[] data, ParseException e) { 
        if (e == null) { 


         final String imgUrl = imageUploadPassed.getParseFile("imageContent").getUrl(); 


         mProfilePic = (ImageView) findViewById(R.id.profileImage); 
         Picasso.with(MainActivity.this).load(imgUrl).into(mProfilePic); 

         imageUploadPassed.pinInBackground(); 


        } else { 
         // something went wrong 
        } 
       } 
      }); 


     } 


     //inner helper method 
     private Uri getOutputMediaFileUri(int mediaTypeImage) { 

      if (isExternalStorageAvailable()) { 
       //get the URI 
       //get external storage dir 
       File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "UPLOADIMAGES"); 
       //create subdirectore if it does not exist 
       if (!mediaStorageDir.exists()) { 
        //create dir 
        if (!mediaStorageDir.mkdirs()) { 

         return null; 
        } 
       } 
       //create a file name 
       //create file 
       File mediaFile = null; 
       Date now = new Date(); 
       String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(now); 

       String path = mediaStorageDir.getPath() + File.separator; 
       if (mediaTypeImage == MEDIA_TYPE_IMAGE) { 
        mediaFile = new File(path + "IMG_" + timestamp + ".jpg"); 
       } 
       //return file uri 
       Log.d("UPLOADIMAGE", "FILE: " + Uri.fromFile(mediaFile)); 

       return Uri.fromFile(mediaFile); 
      } else { 

       return null; 
      } 

     } 

     //check if external storage is mounted. helper method 
     private boolean isExternalStorageAvailable() { 
      String state = Environment.getExternalStorageState(); 
      if (state.equals(Environment.MEDIA_MOUNTED)) { 
       return true; 
      } else { 
       return false; 
      } 
     } 

     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if (resultCode == RESULT_OK) { 
       if (requestCode == CHOOSE_PIC_REQUEST_CODE) { 
        if (data == null) { 
         Toast.makeText(getApplicationContext(), "Image cannot be null!", Toast.LENGTH_LONG).show(); 
        } else { 
         mMediaUri = data.getData(); 
         //set previews 
         mPreviewImageView.setImageURI(mMediaUri); 

         //Bundle extras = data.getExtras(); 

         //Log.e("URI", mMediaUri.toString()); 

         //Bitmap bmp = (Bitmap) extras.get("data"); 


        } 
       } else { 

        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
        mediaScanIntent.setData(mMediaUri); 
        sendBroadcast(mediaScanIntent); 
        //set previews 

        mPreviewImageView.setImageURI(mMediaUri); 

       } 

      } else if (resultCode != RESULT_CANCELED) { 
       Toast.makeText(getApplicationContext(), "Cancelled!", Toast.LENGTH_LONG).show(); 
      } 
     } 


     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.menu_main, menu); 
      return true; 
     } 


     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 

      //noinspection SimplifiableIfStatement 
      if (id == R.id.action_settings) { 
       return true; 
      } 

      return super.onOptionsItemSelected(item); 
     } 
    } 

答えて

2

まず、私はこれは本当によく質問を策定し、私はいくつかの評判のすべての男はとても良い策定質問をすることを幸せになることを言わなければなりません。

あなたが遭遇する問題は、基本的にAndroid Activityライフサイクルの問題です。私は、問題は本当に些細なことだと思います:あなたの活動のどこにも、onCreate()があります。パースから画像を取得する場所はありません。ダウンロード方法はonClickListenerでのみ呼び出されます。

代わりにここでそれを持つのだから、私はprivate方法、このようなものの種類にそれを抽出します:

編集:

private void queryImagesFromParse(){ 
     ParseQuery<ParseObject> imagesQuery = new ParseQuery<>("User"); 
     imagesQuery.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(List<ParseObject> imagesItems, ParseException e) { 
       if(e == null){ 

        ParseUser userCurrentOfParse = ParseUser.getCurrentUser(); 
        if(userCurrentOfParse != null) { 
         //final String imgUrl = imageUploadPassed.getParseFile("imageContent").getUrl(); 
         final String imgUrl = userCurrentOfParse.getParseFile("userProfilePics").getUrl(); 


         mHomeProfilePic = (ImageView) findViewById(R.id.userHomeProfilePicImageView); 
         Picasso.with(HomeActivity.this).load(imgUrl).into(mHomeProfilePic); 

         //imageUploadPassed.pinInBackground(); 

         // profileImageId = imageUploadPassed.getObjectId(); 
         //Log.d(TAG, "The object id is: " + profileImageId); 
        } 

       }else{ 
        Toast.makeText(HomeActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 
    } 

(上記のコードは、単にANを与えることです大まかなアイデア、それがコンパイルされれば私は驚くだろう)。

onCreate()の最後にこのメソッドを呼び出します(onStartも同様ですが、私はonCreate()が好きです)。もちろん、あなたがPicassoを使用しますが、それができることを

ところで、非常に良い(それは実際にあなた文字通りextractとどうなるかの方法>Refractor>Extract MethodRight-Clickである)前だったところからも、このメソッドを呼び出すことができます(!1ナノ秒より速くする必要があります)より良いのでPicasso.with(MainActivity.this).load(imgUrl).into(mProfilePic);代わりPicasso.with(getApplicationContext()).load(imgUrl).into(mProfilePic);のごActivityContextでそれを初期化する

編集:はまた、画像がアップロードさや解析にUserテーブルからこの意志を照会していることを確認してください各ユーザが自分の画像(現在ログインしているユーザの画像次の画像をアップロードする他のすべてのユーザーのものではありません。

希望すると助かります!

+1

ありがとうございました。ご回答いただきありがとうございます。ご褒めいただいてありがとうございました。私はこの質問に何か助けを借りずに残しておきたいと考えており、ご協力いただきました。私が家に帰ったら、私はあなたのアプローチを試みるでしょう、そして、私はそれ以上の問題に遭遇すると私はあなたに知らせるでしょう。 – Equivocal

+0

私はコードに変更を加えましたが、それでも動作しません。あなたが正しく言ったことはしていないかもしれませんが、わかりません。私がしたのは、onCreateの外部にメソッドを作成し、そのメソッドの中にonCreate内のonClick内のメソッドを呼び出すよりもクエリの内容を入れることでした。 – Equivocal

+0

はい、完璧ですが、あなたは 'onCreate'でもそれを呼び出すのを忘れましたか?あなたは 'onCreate'の中でそれを呼び出す必要があります。 –