拍照問題一覽

很多APP 都有拍照的需求 但是用戶一旦多起來 問題也會比較多 因為拍照會一并跟著壓縮 上傳甚至會有加水印 兼容問題也隨之而來

這里從頭到尾講一下,看看能不能幫到大家:

1 第一個問題是權限問題 畢竟沒有權限是沒辦法做后面的操作的

RxPermissions.getInstance(this)
                .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean granted) {
                        if (!granted) {
                            showToast("請把相機和存儲權限打開");
                            return;
                        }
                        File sd = Environment.getExternalStorageDirectory();
                        String path = sd.getPath() + "/RxjavaImg"; // 在根目錄創建一個文件夾來存放圖片  可以自己創建
                        File file = new File(path);
                        if (!file.exists()) {
                            file.mkdir();
                        }
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//打開攝像機列表選項
                        intent.putExtra("return-data", false);
                        final Intent intent_camera = getPackageManager().getLaunchIntentForPackage("com.android.camera");
                        if (intent_camera != null) {
                            String s = GetAction_image_capture();
                            int index = s.indexOf("com");
                            if (index == -1) {    //不存在的話  有一些手機 這個會有異常情況  如果沒有這個需求的話 可以把setPackage這段注釋掉 不影響使用
                                intent.setPackage("com.android.camera");  // 設置為手機自帶的默認拍照軟件
                            } else {
                                intent.setPackage(s);  // 有些手機 并不是com.android.camera 相對比較奇特 所以我用了一個判斷前綴應用包名com開頭的區分一下
                            }
                        }
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(AppConfig.CAMERA_TEMP)));  // 里面的AppConfig.CAMERA_TEMP 為保存的文件路徑 最后是.jpg的
                        startActivityForResult(intent, CAMERA);

                    }
                });

這里的操作包括了權限的請求 和最開始的拍照請求 最終圖片保存到對應的目錄

2 第二個問題就是拍照完后的回調

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

               if (requestCode == CAMERA && resultCode == RESULT_OK) {
                  showLoadingDialog("加載中....");
                    /**
                     *  在這里進行回調  有大佬讓我全部操作都寫一個Rxjava里面 現在還在琢磨
                     * 這里取到用戶拍完照的圖片  然后進行壓縮 顯示
                     * getCompressPics()是 核心方法 下面會有寫  AppConfig.CAMERA_TEMP是原圖路徑
                     * */
                          getCompressPics(AppConfig.CAMERA_TEMP);
                  } 

}

3 第三個 這里應該是核心問題了 圖片壓縮 打水印 和最后的回傳

    public void getCompressPics(final String pathString) {
        File file = new File(pathString);
        final String paths[] = new String[2];
        LubanText.get(PhotoBaseActivity3.this)
                .load(file)
                .putGear(LubanText.THIRD_GEAR)/** 兼容性最好*/
                        .asObservable()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<File, File>() {
                    @Override
                    public File call(File file) {
                        /**加水印  這里傳的是 文件地址   操作的 都是一樣的東西*/
                        return Watermark(file.getPath(), 80);
                    }
                })
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .unsubscribeOn(Schedulers.io())
                .doOnError(new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                    }
                })
                .onErrorResumeNext(new Func1<Throwable, Observable<? extends File>>() {
                    @Override
                    public Observable<? extends File> call(Throwable throwable) {
//                        Toast.makeText(mContext, "由于沒有讀寫權限導致無法正常壓縮", Toast.LENGTH_SHORT).show();

                        dismissLoadingDialog(); //取消加載框  不寫的話 注釋掉就可以了
//                        String s = "/storage/emulated/0/RxjavaImg/image/2017-07-19/1500447991691.jpg";
                                onReceiveCamera1(AppConfig.CAMERA_TEMP);  // onReceiveCamera1()這個方法是一個回調 把 圖片路徑返回 回去
                             return Observable.empty();
                    }
                })
                .subscribe(new Action1<File>() {
                    @Override
                    public void call(File file) {
                        LogUtil.e("msg", "file:" + file);
                        LogUtil.e("msg", file.length() / 1024 + "k");
                        LogUtil.e("msg", 
               
                        pach = file + "";
                        /**處理完之后回調回去  返回給對應的類*/
                          dismissLoadingDialog();  //取消加載框  不寫的話 注釋掉就可以了
                         onReceiveCamera1(pach);  // onReceiveCamera1()這個方法是一個回調 把 圖片路徑返回 回去
                    }
                });
    }

回調之后 要干嘛就干嘛了 下面是支持的方法 還有最重要的水印

4 第四個 水印


 /***
     * 打水印的方法
     * 三次修改版
     * 1 就是先縮放讀取原圖,
     * 2 然后加水印,
     * 3 再生成新的圖片文件
     */
    private File Watermark(String filePath, int Ratio) {

        /**
         * 最終保存的圖片尺寸
         * 寬度  高度  壓縮率
         * 寬高并不會固定為輸入尺寸 只是參考
         * 壓縮率直接影響 文件大小
         * 有問題 直接修改這里的數值!!
         * .putGear(LubanText.CUSTOM_GEAR) 這里也有影響
         *  */
        int Width = 720;
        int Height = 1280;
        int ratio = Ratio;

        /**保存的圖片名稱  記得要創建一下   最終提交的圖片  */
        String PathName = AppConfig.APP_IMAGE_FOLDER + System.currentTimeMillis() + ".jpg";


        File preFile = new File(PathName);
        try {
            /** 創建一下*/
            if (!preFile.exists()) {
                preFile.createNewFile();
            }
            /** 縮放并讀取圖片文件    質量問題 直接調后面兩個長寬度  按照等比 縮放的 所以沒問題* */
            Bitmap resizedBitmap = BitmapUtilsText.getZoomImage(filePath, Width, Height);

//  ImageTool.generatorContactCountIcon 這個是打水印的方法 百度一下 挺多的 

            if (true || true) {
                LogUtil.e("msg", "打水印" + PathName);
           isHasWaterMark1 = "2017年12月31日11.11.11";
           s = "廣州市天河區超級超級美女店!";
                resizedBitmap = ImageTool.generatorContactCountIcon(resizedBitmap, this, isHasWaterMark1, s);
            }

            /**保存操作 這里放的是新地址*/
            BufferedOutputStream bos2;
            bos2 = new BufferedOutputStream(new FileOutputStream(preFile));
            resizedBitmap.compress(Bitmap.CompressFormat.JPEG, ratio, bos2);

            LogUtil.e("msg", "file:getWidth" + resizedBitmap.getWidth());
            LogUtil.e("msg", "file:getHeight" + resizedBitmap.getHeight());
            LogUtil.e("msg", "拍照后保存的圖片文件大小" + preFile.length() / 1024 + "kb");

            resizedBitmap.recycle();
            resizedBitmap = null;
            bos2.flush();
            bos2.close();

        } catch (Exception e) {
            LogUtil.e("msg", "添加水印出現異常");
            e.printStackTrace();
        }

        return preFile;
    }

5 第5個 支撐上面運行的方法

 //獲取手機內部原生的應用相機包名
    private String GetAction_image_capture() {
        String Action_image_capture = "";
        Intent infoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        ResolveInfo resolveInfo = getPackageManager().resolveActivity(infoIntent, 0);
        if (resolveInfo != null) {
            Log.d("PhotoBaseActivity3", "手機默認相機名稱為" + resolveInfo.activityInfo.packageName);
            Action_image_capture = resolveInfo.activityInfo.packageName;
        }
        return Action_image_capture;
    }

    /**
     * 接收到相機拍照的圖片
     */
    protected abstract void onReceiveCamera1(String path);
 不知道還有沒有遺漏 也就僅供參考罷了  親自測試了 華為 小米 oppo vivo 努比亞 索尼  樂視 等等幾十臺手機,還在提高兼容度 有不對的地方 希望大家指出  最后 感謝  浪浪大佬的耐心指導  非常感謝!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,733評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,172評論 4 61
  • React介紹 react不是一個mvc的框架,它僅僅是V層。它是一個鼓勵構建隨著數據變化而改變UI表現的庫。 R...
    我能堅持多久閱讀 596評論 0 1
  • 因為本地存在該賬號的證書,解決辦法: 因為你的賬號中已經有了證書了,而那個證書是由別的電腦生成的,所以你這個不能生...
    亦晴工作室閱讀 1,015評論 0 0
  • 夜靜,朦朧,欲催歸 屏風墨跡香,梅印潦僚, 月稀風寂,畫扇深處女子香,塵世幾許望斷腸,誰傷一生? 梧桐樹下,畫扇依...
    小屋的屋閱讀 218評論 0 1