android選擇圖片或拍照圖片上傳到服務器(包括上傳參數)
open failed: EACCES (Permission denied)"權限已加,寫入sd卡仍報錯的解決辦法
權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
界面:
代碼:
load_weight_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/upload_pic" android:layout_width="match_parent" android:layout_height="290dp" android:layout_gravity="center_horizontal" android:layout_alignParentRight="true" android:layout_below="@+id/receive_weight" android:layout_centerVertical="true" android:layout_marginTop="10dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:adjustViewBounds="true"/> <Button android:id="@+id/select_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:layout_marginLeft="30.0dip" android:layout_marginRight="30.0dip" android:layout_gravity="center" android:layout_centerInParent="true" android:scaleType="fitXY" android:background="@mipmap/select_pic_btn" /> <Button android:id="@+id/upload_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginLeft="30.0dip" android:layout_marginRight="30.0dip" android:layout_gravity="center" android:layout_centerInParent="true" android:scaleType="fitXY" android:background="@mipmap/upload_btn" /> </LinearLayout>
upload_pic.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_margin="10dp" android:paddingBottom="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" > <Button android:id="@+id/btn_pop_album" android:layout_width="match_parent" android:layout_height="45dp" android:text="本地相冊" android:background="#ffff" android:textSize="18sp" /> <Button android:id="@+id/btn_pop_camera" android:layout_width="match_parent" android:layout_height="45dp" android:text="相機拍攝" android:background="#ffff" android:textSize="18sp" /> <Button android:id="@+id/btn_pop_cancel" android:layout_width="match_parent" android:layout_height="45dp" android:layout_marginTop="10dp" android:background="#ffff" android:text="取消" android:textSize="18sp" /> </LinearLayout> </RelativeLayout>
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import zpwmall.com.tms.R;
import zpwmall.com.tms.adapter.UploadAsyncTask;
import zpwmall.com.tms.constant.Contants;
import zpwmall.com.tms.utils.MyApplication;
public class WeightActivity extends BaseActivity {
private ImageView upload_pic;
private Button select_btn,upload_btn;
private File photoFile = null;
private Uri tempUri = null;
private EditText send_weight,receive_weight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.load_weight_item);
//Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
upload_pic = (ImageView)findViewById(R.id.upload_pic);
select_btn = (Button)findViewById(R.id.select_btn);
upload_btn = (Button)findViewById(R.id.upload_btn);
send_weight = (EditText)findViewById(R.id.send_weight);
receive_weight = (EditText)findViewById(R.id.receive_weight);
upload_pic.setVisibility(View.GONE);
select_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopWindow();
}
});
upload_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String send = send_weight.getText().toString();
String receive = receive_weight.getText().toString();
if(TextUtils.isEmpty(send)){
Toast.makeText(MyApplication.getContext(), R.string.pls_input_send_weight, Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(receive)){
Toast.makeText(MyApplication.getContext(), R.string.pls_input_receive_weight, Toast.LENGTH_SHORT).show();
return;
}
if(upload_pic.getDrawable() == null || upload_pic.getDrawable().getCurrent() == null ||
upload_pic.getDrawable().getCurrent().getConstantState() == null){
Toast.makeText(MyApplication.getContext(), R.string.pls_select_or_take_photo, Toast.LENGTH_SHORT).show();
return;
}
//String filePath = tempUri.getEncodedPath();
String filePath = getPathByUri4kitkat(MyApplication.getContext(),tempUri);
final String imagePath = Uri.decode(filePath);
new UploadAsyncTask(WeightActivity.this,imagePath).execute();
}
});
}
private void showPopWindow(){
View popView = View.inflate(this,R.layout.upload_pic,null);
Button bt_album = (Button) popView.findViewById(R.id.btn_pop_album);
Button bt_camera = (Button) popView.findViewById(R.id.btn_pop_camera);
Button bt_cancle = (Button) popView.findViewById(R.id.btn_pop_cancel);
//獲取屏幕寬高
int weight = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels*1/3;
final PopupWindow popupWindow = new PopupWindow(popView,weight,height);
//popupWindow.setAnimationStyle(R.style.anim_popup_dir);
popupWindow.setFocusable(true);
//點擊外部popueWindow消失
popupWindow.setOutsideTouchable(true);
bt_album.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, Contants.RESULT_LOAD_IMAGE);
popupWindow.dismiss();
}
});
bt_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
takeCamera();
popupWindow.dismiss();
}
});
bt_cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
});
//popupWindow消失屏幕變爲不透明
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1.0f;
getWindow().setAttributes(lp);
}
});
//popupWindow出現屏幕變爲半透明
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 0.5f;
getWindow().setAttributes(lp);
popupWindow.showAtLocation(popView, Gravity.BOTTOM,0,50);
}
private void takeCamera() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
String mTempPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "photo.jpeg";
photoFile = new File(mTempPhotoPath);
//photoFile = createImageFile();
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
}
}
startActivityForResult(takePictureIntent, Contants.RESULT_CAMERA_IMAGE);//跳轉界面傳回拍照所得數據
}
/* private File createImageFile() {
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File image = null;
try {
image = File.createTempFile(
generateFileName(), *//* prefix *//*
".jpg", *//* suffix *//*
storageDir *//* directory *//*
);
} catch (IOException e) {
e.printStackTrace();
}
String mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
public static String generateFileName() {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
return imageFileName;
}*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK ) {
if (requestCode == Contants.RESULT_LOAD_IMAGE) {
Uri selectedImage = data.getData();
tempUri = selectedImage;
}else if (requestCode == Contants.RESULT_CAMERA_IMAGE){
Uri uri = Uri.fromFile(photoFile);
tempUri = uri;
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//申請WRITE_EXTERNAL_STORAGE權限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else{
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempUri));
upload_pic.setImageBitmap(bitmap);
upload_pic.setVisibility(View.VISIBLE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(tempUri));
upload_pic.setImageBitmap(bitmap);
upload_pic.setVisibility(View.VISIBLE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
Toast.makeText(this, "deny", Toast.LENGTH_SHORT).show();
}
return;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
// 專爲Android4.4設計的從Uri獲取文件絕對路徑,以前的方法已不好使
@SuppressLint("NewApi")
public static String getPathByUri4kitkat(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
if (isExternalStorageDocument(uri)) {// ExternalStorageProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {// DownloadsProvider
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
} else if (isMediaDocument(uri)) {// MediaProvider
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] { split[1] };
return getDataColumn(context, contentUri, selection, selectionArgs);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore
// (and
// general)
return getDataColumn(context, uri, null, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {// File
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context
* The context.
* @param uri
* The Uri to query.
* @param selection
* (Optional) Filter used in the query.
* @param selectionArgs
* (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = { column };
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
}
上傳異步任務:
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import zpwmall.com.tms.ui.WeightActivity;
import zpwmall.com.tms.utils.MyApplication;
/**
* Created by Administrator on 2018/6/13.
*/
public class UploadAsyncTask extends AsyncTask<String, Integer, String> {
private String imagePath;
private WeightActivity context;
public UploadAsyncTask(){}
public UploadAsyncTask(WeightActivity context,String path){
this.imagePath = path;
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... param) {
OkHttpClient mOkHttpClient = new OkHttpClient();
String result = "error";
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.addFormDataPart("image", imagePath,
RequestBody.create(MediaType.parse("image/jpeg"), new File(imagePath)));
RequestBody requestBody = builder.build();
Request.Builder reqBuilder = new Request.Builder();
Request request = reqBuilder
.url("http://xx/itemUpload")
.post(requestBody)
.build();
Log.d("UploadAsyncTask", "請求地址 http://xx/itemUpload");
try{
Response response = mOkHttpClient.newCall(request).execute();
Log.d("UploadAsyncTask", "響應碼 " + response.code());
if (response.isSuccessful()) {
String resultValue = response.body().string();
Log.d("UploadAsyncTask", "響應體 " + resultValue);
return resultValue;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) {
JSONObject json = JSONObject.parseObject(result);
Log.i("result", result);
if (json.getString("ret").equals("true")) {
Toast.makeText(MyApplication.getContext(), "上傳成功!", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MyApplication.getContext(), "上傳失敗!", Toast.LENGTH_SHORT).show();
}
}
}
..