Androidが開発したアップロード画像とカメラとアルバムの呼び出し

46300 ワード

図を見て分析する:
  • インターフェースUIレイアウト:
  • <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scrollbars="vertical"
                android:background="@color/color_white">
    
        <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="@dimen/size_50dp" >
    
            <TextView
                    android:id="@+id/viewpager_item_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="@dimen/size_14dp"
                    android:padding="@dimen/size_14dp"
                    android:textColor="@color/color_000"
                    android:textSize="@dimen/size_14dp" />
    
            <RelativeLayout
                    android:id="@+id/viewpager_item_viewed"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/viewpager_item_title"
                    android:layout_marginLeft="@dimen/size_14dp"
                    android:layout_marginRight="@dimen/size_14dp"
                    android:background="@drawable/bg_ed_shape" >
    
                <EditText
                        android:id="@+id/viewpager_item_edittext"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@null"
                        android:gravity="top"
                        android:hint="@string/viewpager_edittext_hint"
                        android:inputType="textMultiLine"
                        android:maxLines="50"
                        android:minHeight="@dimen/size_150dp"
                        android:padding="@dimen/size_14dp"
                        android:textColor="@color/color_000"
                        android:textColorHint="@color/color_c"
                        android:textSize="@dimen/size_14dp" />
    
                <LinearLayout
                        android:id="@+id/viewpager_item_zp_ll"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_above="@+id/line"
                        android:orientation="horizontal"
                        android:padding="@dimen/size_10dp"
                        android:visibility="gone" >
    
                    <ImageView
                            android:id="@+id/viewpager_item_zp_1"
                            android:layout_width="@dimen/size_40dp"
                            android:layout_height="@dimen/size_40dp"
                            android:background="@drawable/xk" />
    
                    <ImageView
                            android:id="@+id/viewpager_item_zp_2"
                            android:layout_width="@dimen/size_40dp"
                            android:layout_height="@dimen/size_40dp"
                            android:layout_marginLeft="@dimen/size_10dp"
                            android:background="@drawable/xk"
                            android:visibility="gone" />
    
                    <ImageView
                            android:id="@+id/viewpager_item_zp_3"
                            android:layout_width="@dimen/size_40dp"
                            android:layout_height="@dimen/size_40dp"
                            android:layout_marginLeft="@dimen/size_10dp"
                            android:background="@drawable/xk"
                            android:visibility="gone" />
    
                    <ImageView
                            android:id="@+id/viewpager_item_zp_4"
                            android:layout_width="@dimen/size_40dp"
                            android:layout_height="@dimen/size_40dp"
                            android:layout_marginLeft="@dimen/size_10dp"
                            android:background="@drawable/xk"
                            android:visibility="gone" />
                </LinearLayout> <ImageView android:id="@+id/line" android:layout_width="match_parent" android:layout_height="1dp" android:layout_below="@+id/viewpager_item_edittext" android:background="@color/color_c9" /> <RelativeLayout android:id="@+id/viewpager_item_viewxj" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/viewpager_item_edittext" android:layout_margin="1dp" android:background="@color/color_bg_hui" > <ImageView android:id="@+id/viewpager_item_xj" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/size_13dp" android:src="@drawable/xj" /> </RelativeLayout> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/viewpager_item_viewxj" /> </RelativeLayout> <TextView android:id="@+id/viewpager_item_next" style="@style/bt_style_bgtowhite" android:layout_below="@+id/viewpager_item_viewed" android:layout_marginTop="@dimen/size_27dp" /> </RelativeLayout> </ScrollView> 
  • Dialog及びUIレイアウト:
  • Dialog:
    public class Pop_Viewpager_Item_Pz {
    
        private static final int CAMERA_WITH_DATA = 1001;
        private static final int PHOTO_PICKED_WITH_DATA = 1002;
        private Activity activity;
        private TextView viewpager_pop_pz_pz, viewpager_pop_pz_xc, viewpager_pop_pz_back;
    
        public Dialog mDialog;
    
        public Dialog getmDialog() {
            return mDialog;
        }
    
        public void setmDialog(Dialog mDialog) {
            this.mDialog = mDialog;
        }
    
        public Pop_Viewpager_Item_Pz(Activity context) {
            activity = context;
            mDialog = new Dialog(context, R.style.Setting_Question_Submit_Dialog_Style);
    
            mDialog.setContentView(R.layout.viewpager_item_pop_pz);
            Window window = mDialog.getWindow();
            WindowManager wm = context.getWindowManager();
            Display d = wm.getDefaultDisplay(); //      、  
            WindowManager.LayoutParams p = window.getAttributes();
            p.width = (int) (d.getWidth() * 0.85);
            window.setAttributes(p);
            mDialog.setFeatureDrawableAlpha(Window.FEATURE_OPTIONS_PANEL, 0);
            window.setWindowAnimations(android.R.anim.fade_in);
    
            viewpager_pop_pz_pz = (TextView) mDialog.findViewById(R.id.viewpager_pop_pz_pz);
            viewpager_pop_pz_pz.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    doTakePhoto(); //      
                }
            });
            viewpager_pop_pz_xc = (TextView) mDialog.findViewById(R.id.viewpager_pop_pz_xc);
            viewpager_pop_pz_xc.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    doSelectImageFromLoacal(); //        
                }
            });
    
            viewpager_pop_pz_back = (TextView) mDialog.findViewById(R.id.viewpager_pop_pz_back);
            viewpager_pop_pz_back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    dismiss();
                }
            });
        }
    
        public void show() {
            mDialog.show();
        }
    
        public void dismiss() {
            mDialog.dismiss();
        }
    }
    UIレイアウト:
    <?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="match_parent" >
    
        <ImageView  android:id="@+id/viewpager_pop_pz_iv" android:layout_width="match_parent" android:layout_height="@dimen/size_20dp" android:layout_alignParentBottom="true" />
    
        <TextView  android:id="@+id/viewpager_pop_pz_back" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/viewpager_pop_pz_iv" android:layout_marginTop="@dimen/size_12dp" android:background="@drawable/viewpager_pop_pz_shape" android:clickable="true" android:gravity="center" android:padding="@dimen/size_12dp" android:text="  " android:textColor="@drawable/bt_bg_selector_bgtofc4025_tv" android:textSize="@dimen/size_20dp" />
    
        <RelativeLayout  android:id="@+id/viewpager_pop_pz" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/viewpager_pop_pz_back" android:background="@drawable/viewpager_pop_pz_shape" >
    
            <TextView  android:id="@+id/viewpager_pop_pz_pz" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:gravity="center" android:padding="@dimen/size_12dp" android:text="  " android:textColor="@drawable/bt_bg_selector_bgtofc4025_tv" android:textSize="@dimen/size_20dp" />
    
            <ImageView  android:id="@+id/viewpager_pop_pz_line" android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_below="@+id/viewpager_pop_pz_pz" android:background="@color/color_c9" />
    
            <TextView  android:id="@+id/viewpager_pop_pz_xc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/viewpager_pop_pz_line" android:clickable="true" android:gravity="center" android:padding="@dimen/size_12dp" android:text="     " android:textColor="@drawable/bt_bg_selector_bgtofc4025_tv" android:textSize="@dimen/size_20dp" />
        </RelativeLayout>
    
    </RelativeLayout>
  • は、システムカメラ
  • を呼び出すために、カメラの写真選択画像を呼び出す。
    /** *        */
    public static void takePhoto(Activity activity) {
    
        String SDState = Environment.getExternalStorageState();
        if (SDState.equals(Environment.MEDIA_MOUNTED)) {
    
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
            ContentValues values = new ContentValues();
            photoUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
    
            activity.startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);
        } else {
            Toast.makeText(activity, "      ", Toast.LENGTH_LONG).show();
        }
    }
  • アルバム選択画像を呼び出す:Intentを介してシステムアルバム
  • を呼び出す。
    /** *            */
    private void doSelectImageFromLoacal() {
        Intent localIntent = new Intent();
        localIntent.setType("image/*");
        localIntent.setAction(Intent.ACTION_GET_CONTENT);
        localIntent.addCategory(Intent.CATEGORY_OPENABLE);
        Intent localIntent2 = Intent.createChooser(localIntent, "    ");
        activity.startActivityForResult(localIntent2, PHOTO_PICKED_WITH_DATA);
    
        mDialog.dismiss();
    }
  • 画像を選択した後、画像を圧縮する:
  • /** *     . */
    private String ys_img(String img_path) {
    
        String[] path_arr = img_path.split("/");
        String[] name_arr = path_arr[path_arr.length - 1].split("\\.");
        String path = File_Tool.SDPATH + "image/" + name_arr[0] + ".png";
    
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        //           
        Bitmap bitmap = BitmapFactory.decodeFile(img_path, options); //     bm  
        options.inJustDecodeBounds = false;
        //      
        int be = (int) (options.outHeight / 60);
        if (be <= 0)
            be = 1;
        options.inSampleSize = be;
        //       ,      options.inJustDecodeBounds    false 
        bitmap = BitmapFactory.decodeFile(img_path, options);
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        ImageView iv = new ImageView(this);
        iv.setImageBitmap(bitmap);
        //bitmap = compressImage(Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), false));
        //                       。              Sdcard        :
        File file = new File(path);
        try {
            FileOutputStream out = new FileOutputStream(file);
            if (bitmap.compress(Bitmap.CompressFormat.PNG, 50, out)) {
                out.flush();
                out.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return path;
    }
  • アップロード画像:AsyncTaskを使用して、Httpとサーバとの相互作用を利用して、ファイルアップロードを完了します。
  • AyncTask
    /** *                 . * * @author wanglei */
    class Put_UserAnser_Task extends AsyncTask<String, Integer, String> {
        ArrayList<String> id_list = new ArrayList<String>();
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected String doInBackground(String... arg0) {
            MyPhotoApp_Data_Application myphoto = (MyPhotoApp_Data_Application) getApplication();
            //TODO
            String url = myphoto.getUrl_host() + "port&a=userPaperAnswer" + "&sid=" + myphoto.getSessionid(), resurt = "";
            ArrayList<NameValuePair> val_list = new ArrayList<NameValuePair>();
            try {
                val_list.add(new BasicNameValuePair("is_img", is_img > 0 ? "1" : "0")); // $is_img=1   ,
                resurt = HttpUtil.getData(MainActivity.this, url, val_list, HttpUtil.METHOD_POST);
            } catch (ConnectException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return resurt;
        }
    
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if ("1".equals(result)) {
                if (is_img > 0) {
                    int img_sum = 0;
                    Intent intent = new Intent(MainActivity.this, UploadImage_Activity.class);
    
                    for (int i=0;i<4;i++) {
                        img_sum++;
                        id_list.add(""+(i+1));
                    }
                    intent.putExtra("img_sum", img_sum);
                    intent.putStringArrayListExtra("id_list", id_list);
                    intent.putStringArrayListExtra("lists", lists);
    
                    MainActivity.this.startActivityForResult(intent, 101);
                    MainActivity.this.finish();
                } else {
                    toast.setText("    ");
                    toast.show();
                }
            } else {
                toast.setText("    ");
                toast.show();
            }
        }
    }
  • Httpは、サーバと対話する
  • public class HttpUtil {
        public static final int METHOD_GET = 1;
        public static final int METHOD_POST = 2;
    
        public static String getData(Context context, String uri, List<NameValuePair> params, int method) throws ConnectException, IOException {
            HttpEntity entity = getEntity(uri, params, method);
            if(entity != null) {
                return EntityUtils.toString(entity);
            } else {
                return "error";
            }
        }
    
        public static HttpEntity getEntity(String uri, List<NameValuePair> params, int method) throws ConnectException, IOException {
            HttpEntity entity = null;
            HttpClient client = new DefaultHttpClient();
            client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
            client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 20000);
            HttpUriRequest request = null;
            switch (method) {
            case METHOD_GET:
                StringBuilder sb = new StringBuilder(uri);
                if (params != null && !params.isEmpty()) {
                    sb.append('?');
                    for (NameValuePair pair : params) {
                        sb.append(pair.getName()).append('=').append(pair.getValue()).append('&');
                    }
                    sb.deleteCharAt(sb.length() - 1);
                }
                request = new HttpGet(sb.toString());
                break;
            case METHOD_POST:
                request = new HttpPost(uri);
                if (params != null && !params.isEmpty()) {
                    UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity(params, "UTF-8");
                    ((HttpPost) request).setEntity(reqEntity);
    
                }
                break;
            }
            HttpResponse response = client.execute(request);
    
            if (response.getStatusLine().getStatusCode() == 200) {
                entity = response.getEntity();
            } else {
    
            }
            return entity;
        }
    }
    
  • カスタムアップロード進捗
  • public class CircleProgressBar extends View {
        private int maxProgress = 100;
        private int progress = 0;
        private int progressStrokeWidth = 20;
        //          
        RectF oval;
        Paint paint;
    
        public CircleProgressBar(Context context, AttributeSet attrs) {
            super(context, attrs);
            oval = new RectF();
            paint = new Paint();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            int width = this.getWidth();
            int height = this.getHeight();
    
            if (width != height) {
                int min = Math.min(width, height);
                width = min;
                height = min;
            }
    
            paint.setAntiAlias(true); //         
            paint.setColor(Color.WHITE); //       
            canvas.drawColor(Color.TRANSPARENT); //     
            paint.setStrokeWidth(progressStrokeWidth); //   
            paint.setStyle(Style.STROKE);
    
            oval.left = progressStrokeWidth / 2; //    x
            oval.top = progressStrokeWidth / 2; //    y
            oval.right = width - progressStrokeWidth / 2; //    x
            oval.bottom = height - progressStrokeWidth / 2; //    y
    
            canvas.drawArc(oval, -90, 360, false, paint); //       ,      
            paint.setColor(Color.RED);
            canvas.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, paint); //       ,     
    
            paint.setStrokeWidth(1);
            String text = progress + "%";
            int textHeight = height / 4;
            paint.setTextSize(textHeight);
            int textWidth = (int) paint.measureText(text, 0, text.length());
            paint.setStyle(Style.FILL);
            canvas.drawText(text, width / 2 - textWidth / 2, height / 2 + textHeight / 2, paint);
    
        }
    
        public int getMaxProgress() {
            return maxProgress;
        }
    
        public void setMaxProgress(int maxProgress) {
            this.maxProgress = maxProgress;
        }
    
        public void setProgress(int progress) {
            this.progress = progress;
            this.invalidate();
        }
    
        /** *  UI     */
        public void setProgressNotInUiThread(int progress) {
            this.progress = progress;
            this.postInvalidate();
        }
    }
  • Notificationステータスバー通知
  • private NotificationManager manager;
    private Notification notif;
    
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    notif.contentView.setTextViewText(R.id.content_view_text1, len + " %");
                    notif.contentView.setProgressBar(R.id.content_view_progress, 100, len, false);
                    manager.notify(0, notif);
                    break;
                case 1:
                    manager.cancel(0);
                    break;
                default:
                    break;
            }
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.upload_image);
        init_PutImg();
    }
    
    private void init_PutImg() {
    
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, new Intent(), 0);
        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notif = new Notification();
        notif.icon = R.drawable.ic_launcher;
        notif.tickerText = "        ";
        notif.flags = Notification.FLAG_AUTO_CANCEL;
    
        //              
        notif.contentView = new RemoteViews(getPackageName(), R.layout.content_view);
        notif.contentIntent = pIntent;
        manager.notify(0, notif);
        manager.cancel(0);
    }
  • ステータスバー通知UIレイアウト:
  • <?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="match_parent" >
    
        <ImageView  android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/size_10dp" android:layout_marginRight="@dimen/size_10dp" android:background="@drawable/ic_launcher" />
    
        <RelativeLayout  android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="@dimen/size_10dp" android:layout_toRightOf="@+id/icon" >
    
            <TextView  android:id="@+id/content_view_text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/size_8dp" android:text="0 %" android:textColor="@color/color_c50619" android:textSize="@dimen/size_14dp" />
    
            <ProgressBar  android:id="@+id/content_view_progress" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="fill_parent" android:layout_height="1dp" android:layout_below="@+id/content_view_text1" android:layout_marginTop="14dp" android:max="100" android:progressDrawable="@drawable/barcolor" />
        </RelativeLayout>
    
    </RelativeLayout>
    コードスタンプ例Here