七牛雲上傳圖片和視頻

先說本文主要的重點:

七牛雲上傳圖片(包括從相機獲取的和從相冊獲取的)    七牛雲上傳視頻       8.0手機調起相機        都會進行描述    多圖片和多視頻上傳    獲取圖片後綴   隱藏軟鍵盤

1、導入七牛雲的依賴

 //七牛雲
    api 'com.qiniu:qiniu-android-sdk:7.3.+'
    api 'pub.devrel:easypermissions:0.4.3'
    api 'com.qiniu:happy-dns:0.2.13'
    api 'com.loopj.android:android-async-http:1.4.9'

2、添加七牛雲的工具類

https://download.csdn.net/download/jing_80/10832747     可以下載,我已上傳

3、因爲出於保護數據   所以中間的字符用xxxxx代替,這兩個變量在七牛雲上可以獲取到,這個很重要,這個是獲取七牛雲Token需要用到的,不過我們這裏的token是我們的後臺返給我的,所以各位小夥伴看情況而定

    public static final String AccessKey = "-lOgC9xxxxxxxxxxxxiHIBDSrIZ";
    public static final String SecretKey = "PYCGWxxxxxxxxxxxxxxxKw0F0v0B0Sty4m";

4、前面的準備工作做完之後,來吧,接下來我們要寫真正的上傳代碼了,一步一步來

如果你是準備好了相機相冊各種權限的 就不說了   直接看(2)

如果你是什麼也沒寫,那就先添加上調用相機所用的權限吧! 先看(1)

(1)在res下創建xml文件

xml文件中的內容:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path path="" name="camera_photos" />
</paths>

再在AndroidManifest中添加代碼和權限    權限可能不夠    需要什麼再添加

    <uses-permission android:name="android.permission.INTERNET" />

    <uses-feature android:name="android.hardware.camera" />
    <!-- 相機權限 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 寫入SD卡的權限:如果你希望保存相機拍照後的照片 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 讀取SD卡的權限:打開相冊選取圖片所必須的權限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在AndroidManifest中添加  這個provider和activity同級的

       <!-- 8.0相機 -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_path" />
        </provider>

(2)七牛雲上傳代碼

public class UploadDynamicActivity implements View.OnClickListener {

    private static final int REQUEST_CODE_VIDEO = 0x00000012;
    private static final int REQUEST_CODE_CAMERA = 0x00000011;
    private static final int REQUEST_CODE_ALBUM = 0x00000010;
    private String upPath,videoThumb;
    private String headpicPath;
    private Uri uri;
    private File file;


    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 12) {
                String headpicPaths = (String) msg.obj;
                if (headpicPaths != null) {

//                    headpicPaths是七牛雲返回的地址    這裏寫自己的處理
                }
            }
        }
    };

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

        switch (requestCode) {
            case REQUEST_CODE_CAMERA:
                if (resultCode == RESULT_OK) {
                    upPath = file.getAbsolutePath();
                    break;
                }

            case REQUEST_CODE_ALBUM:
                if (resultCode == RESULT_OK) {
                    Uri uriAlbum = data.getData();
                    upPath = fromImageUriGetPath(uriAlbum);
                    break;
                }

            case REQUEST_CODE_VIDEO:
                if (resultCode == RESULT_OK) {
                    //從相冊選取視頻
                    Uri selectedVideo = data.getData();
                    upPath = fromVideoUriGetPath(selectedVideo);
                    break;
                }
                break;
        }
    }

    //    利用獲取到的圖片Uri  在獲取到圖片對應的path
    private String fromImageUriGetPath(Uri uri) {
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(uri,
                filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        //picturePath就是圖片在儲存卡所在的位置
        String picturePath = cursor.getString(columnIndex);

        cursor.close();

        return picturePath;
    }

    //    利用獲取到的視頻Uri  在獲取到視頻對應的path
    private String fromVideoUriGetPath(Uri uri) {
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(uri,
                new String[]{MediaStore.Video.Media.DATA}, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        //picturePath就是圖片在儲存卡所在的位置
        String picturePaths = cursor.getString(columnIndex);

        //這個videoThumb是獲取該視頻縮略圖的地址    至於怎麼獲取的縮略圖   我的博客裏有    獲取網絡的  獲取本地的 只需要視頻地址就可以
        Bitmap netVideoBitmap = VideoFrameUtils.getLocalVideoBitmap(picturePaths);
        videoThumb = VideoFrameUtils.saveBitmap(UploadDynamicActivity.this, netVideoBitmap);
        
        cursor.close();

        return picturePaths;
    }

    //上傳圖片或視頻到七牛雲的方法
    private void uploadInfoToQiNiu(final String path) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String picSuffix = getPicSuffix(path);
                String randomNumCode = getRandomNumCode();
                // 設置圖片名字
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                String key = "icon_" + sdf.format(new Date()) + randomNumCode + "." + picSuffix;
                UploadManager uploadManager = new UploadManager();

                //這個getQNToken需要從後臺獲取 或者是自己從七牛雲上找方法獲取

                uploadManager.put(path, key, getQNToken, new UpCompletionHandler() {
                    @Override
                    public void complete(String key, ResponseInfo info, JSONObject res) {
                        if (info.isOK()) {
                            //這個是你將圖片上傳之後七牛雲給你返回的地址    這個需要傳給你們的後臺
                            headpicPath = "http://qiniu.bjmocang.com/" + key;

                            Message message = handler.obtainMessage(12, headpicPath);
                            handler.sendMessage(message);
                        } else {
                            Log.e("tagxx", info.error);
                        }
                    }
                }, null);
            }
        }).start();

    }


    //調取相機
    private void fromCamera() {
        file = new File(Environment.getExternalStorageDirectory(), SystemClock.uptimeMillis() + ".jpg");
        if (Build.VERSION.SDK_INT >= 24) {
            uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);
        } else {
            uri = Uri.fromFile(file);
        }
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, REQUEST_CODE_CAMERA);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.相機:
                fromCamera();
                break;
            case R.id.相冊:
                Intent intentAlbum = new Intent(Intent.ACTION_PICK);
                intentAlbum.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(intentAlbum, REQUEST_CODE_ALBUM);
                break;
            case R.id.視頻:
                Intent intentVideo = new Intent(Intent.ACTION_PICK);
                intentVideo.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*");
                startActivityForResult(intentVideo, REQUEST_CODE_VIDEO);
                break;
        }
    }

    @AfterPermissionGranted(1)//添加註解,是爲了首次執行權限申請後,回調該方法
    private void methodRequiresTwoPermission() {
        String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        if (EasyPermissions.hasPermissions(this, perms)) {
            //已經申請過權限,直接調用相機
            // openCamera();
        } else {
            EasyPermissions.requestPermissions(this, "需要獲取權限", 1, perms);
        }
    }

    //生成四位隨機數
    public static String getRandomNumCode() {
        String codeNum = "";
        int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int next = random.nextInt(10000);
            codeNum += numbers[next % 10];
        }
        return codeNum;
    }

    /**
     * 獲取圖片後綴
     *
     * @param img_path 圖片或者視頻路徑
     * @return
     */
    public static String getPicSuffix(String img_path) {
        if (img_path == null || img_path.indexOf(".") == -1) {
            return ""; //如果圖片地址爲null或者地址中沒有"."就返回""
        }
        return img_path.substring(img_path.lastIndexOf(".") + 1).
                trim().toLowerCase();
    }

    //設置點擊任意空白處隱藏鍵盤
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            // 獲得當前得到焦點的View,一般情況下就是EditText(特殊情況就是軌跡求或者實體案件會移動焦點)
            View v = getCurrentFocus();
            if (HideInputUtil.isShouldHideInput(v, ev)) {
                hideSoftInput(v.getWindowToken());
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 隱藏軟鍵盤 
     *
     * @param token
     */
    private void hideSoftInput(IBinder token) {
        if (token != null) {
            InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

}

5、好了,到這裏就結束了。希望能幫助到各位博友

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章