Android呼び出しシステムカメラとアルバムにアイコンをアップロード
13131 ワード
ところで昨日の氷のかけらは本当に大きくて、自転車で帰ってきた途中で顔が殴られて痛いですね.清明節の連休初日、この時間を借りて、先日記録したい内容を補充しましょう.
この文章は主にシステムカメラを呼び出したり、システムアルバムから写真を選んでアップロードしたりすることを記録しています.これは普通のニーズで、ネット上の例も多いですが、(注意:前方高エネルギー警報!!)私は1つの穴に出会って、選択した画像はプレビューボックスで時々表示して、時には表示しないで、これはどのように破れます!ネット上の例は探してもだめで、それから繰り返しテストを経て、問題を発見して、アイコンのページを変更する時に私はまずネットを通じて前のアイコンを取得して、それから展示しました.問題はここにあります.前にアイコンがなかった場合、ここではglideでerrorアイコンの代わりに表示され、その後、各種の選択アイコンがプレビューボックスで表示されませんでしたが、前にアイコンがあって正常に表示されたら、今から画像を選択して、プレビューボックスは表示できます.これは難しいですが、最後に解決策を見つけました.ここではまず他のコードを見て、興味のない文末の解決策を見てみましょう.
まず、レイアウトファイルを見てみましょう.
次はボタンのクリックイベントです.
アルバムから画像を取得:
カメラで画像を取得する方法:
コールバックメソッドは次のとおりです.
getUriPath()メソッドを見てみましょう.
そしてbase 64に変換する方法も貼っておきましょう.
最後に、選択した写真をサーバに送信します.
はい、コードは簡単ですが、このコードです.文章の冒頭に述べた問題が発生しました.繰り返しテストを経て、問題は解決しました.以下のようにします.
この文章は主にシステムカメラを呼び出したり、システムアルバムから写真を選んでアップロードしたりすることを記録しています.これは普通のニーズで、ネット上の例も多いですが、(注意:前方高エネルギー警報!!)私は1つの穴に出会って、選択した画像はプレビューボックスで時々表示して、時には表示しないで、これはどのように破れます!ネット上の例は探してもだめで、それから繰り返しテストを経て、問題を発見して、アイコンのページを変更する時に私はまずネットを通じて前のアイコンを取得して、それから展示しました.問題はここにあります.前にアイコンがなかった場合、ここではglideでerrorアイコンの代わりに表示され、その後、各種の選択アイコンがプレビューボックスで表示されませんでしたが、前にアイコンがあって正常に表示されたら、今から画像を選択して、プレビューボックスは表示できます.これは難しいですが、最後に解決策を見つけました.ここではまず他のコードを見て、興味のない文末の解決策を見てみましょう.
まず、レイアウトファイルを見てみましょう.
然后,在oncreate()方法中加载之前的头像,我这里是提前获取了头像存在了application中的实体类currentUser中
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_photo);
ButterKnife.bind(this);
tvTitle.setText(" ");
tvGot.setVisibility(View.GONE);// ,
// application user photo ,
Glide.with(this)
.load(TApplication.currentUser.getIvPhoto())
.into(ivPhoto);
}
次はボタンのクリックイベントです.
@OnClick({R.id.change_photo_camera, R.id.change_photo_pic, R.id.iv_title_back, R.id.change_photo_tv_got})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.change_photo_camera:
// ,
takePictureByCamera(this, GET_PICTURE_BY_CAMRA);
break;
case R.id.change_photo_pic:
//
takePictureByPic(this,GET_PICTURE_BY_PIC);
break;
case R.id.change_photo_tv_got:
// ,
// ,
setPhoto(url, ivPhotoStr);
break;
}
}
アルバムから画像を取得:
private void takePictureByPic(Context context, int requestCode) {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// ,
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
// :
// app , , true.
// ”Don’t ask again” , false.
// , false.
// ,
Toast.makeText(this, " !", Toast.LENGTH_LONG).show();
// ,
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri1 = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri1);
startActivity(intent);
} else {
// ,
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STOORAGE_REQUEST_CODE);
}
} else {
// ,
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, requestCode);
}
}
カメラで画像を取得する方法:
public void takePictureByCamera(Context context, int requestCode) {
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context,
new String[]{Manifest.permission.CAMERA},
TAKE_PHOTO_REQUEST_CODE);
} else {
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE, null);
startActivityForResult(intent, requestCode);
}
}
コールバックメソッドは次のとおりです.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (requestCode == GET_PICTURE_BY_PIC) {//
Uri uri = data.getData();//content://media/external/images/media/72876
Bitmap bitmap1 = null;
if (uri != null) {
String path = getUriPath(uri);// uri ,
try {
bitmap1 = BitmapFactory.decodeFile(path);
ivPhoto.setImageBitmap(bitmap1);// , , ,
ivPhotoStr = bitmapToBase64(bitmap1);// , base64
tvGot.setVisibility(View.VISIBLE);
} catch (Exception e) {
e.printStackTrace();
}
}
}
if (requestCode == GET_PICTURE_BY_CAMRA) {//
Uri uri = data.getData();
if (uri == null) {
Bundle pBundle = data.getExtras(); // intent ,
if (pBundle != null) {
Bitmap mBitmap = (Bitmap) pBundle.get("data"); //get bitmap
ivPhoto.setImageBitmap(mBitmap);// , , ,
ivPhotoStr = bitmapToBase64(mBitmap);// , base64
tvGot.setVisibility(View.VISIBLE);
Log.i("", "onActivityResult: bitmap" + ivPhotoStr);
} else {
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
return;
}
} else {
ImageCompress.CompressOptions options = new ImageCompress.CompressOptions();
options.maxHeight = 200;
options.maxWidth = 200;
options.uri = data.getData();
ImageCompress imageCompress = new ImageCompress();
Bitmap mBitmap = imageCompress.compressFromUri(this, options);
if (mBitmap != null) {
ivPhoto.setImageBitmap(mBitmap);// , , ,
ivPhotoStr = bitmapToBase64(mBitmap);// , base64
tvGot.setVisibility(View.VISIBLE);
Log.i("", "onActivityResult: ivPhotoStr" + ivPhotoStr);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
getUriPath()メソッドを見てみましょう.
private String getUriPath(Uri uri) {
String data = null;
if (null == uri)
return null;
final String scheme = uri.getScheme();
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}
そしてbase 64に変換する方法も貼っておきましょう.
public static String bitmapToBase64(Bitmap bitmap) {
String result = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baos.flush();
baos.close();
byte[] bitmapBytes = baos.toByteArray();
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
最後に、選択した写真をサーバに送信します.
private void setPhoto(final String url, final String ivPhotoStr) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("_id", TApplication.currentUser.get_id())
.add("photo", ivPhotoStr)
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String s = response.body().string();
Log.i("", "run: setPhoto" + s);
Message message = handler.obtainMessage();
message.what = 1;
message.obj = s;
handler.sendMessage(message);
} else {
Log.i("", "run: setPhoto" + response.body().string());
Message message = handler.obtainMessage();
message.what = 0;
handler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
はい、コードは簡単ですが、このコードです.文章の冒頭に述べた問題が発生しました.繰り返しテストを経て、問題は解決しました.以下のようにします.
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_photo);
ButterKnife.bind(this);
tvTitle.setText(" ");
tvGot.setVisibility(View.GONE);// ,
// , ,
// , , , ivPhoto ,
// ,
if (!TApplication.currentUser.getIvPhoto().equals(Path.KEY_MAIN_PHOTO_PATH)){
Glide.with(this)
.load(TApplication.currentUser.getIvPhoto())
.into(ivPhoto);
}else {
// ,
}
}
問題は解決しましたが、なぜ、ずっと分からなかったのか、どなたか分かる方がいらっしゃいましたら、伝言をお願いします.