融雲 Android SDK 拍照,圖片選取器方案分析

來源:互聯網
上載者:User

標籤:android   融雲   

一  拍照

目前拍照融雲提供兩種方案 


1 SDK kit 包中內建的拍照 關鍵類 : CameraInputProvider 

此類點擊是喚起 TakingPicturesActivity 特點是拍照後 勾選完成 會有一個預覽介面  此方案如果在某些機型上 點擊勾選後無響應 是因為

一些機型喚起 系統相機後 把下面的棧資源回收了 已經做了 onSaveInstanceState 的生命週期儲存瞬間狀態 但是還是偶現此情況 

下面貼出實現代碼 如果有知道此問題終極解決方案的開發人員 歡迎留言 或者 聯絡筆者

public class TakingPicturesActivity extends Activity implements View.OnClickListener {    private final static int REQUEST_CAMERA = 0x2;    private ImageView mImage;    private Uri mSavedPicUri;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.rc_ac_camera);        Button cancel = (Button) findViewById(R.id.rc_back);        Button send = (Button) findViewById(R.id.rc_send);        mImage = (ImageView) findViewById(R.id.rc_img);        cancel.setOnClickListener(this);        send.setOnClickListener(this);        RLog.d(this, "onCreate", "savedInstanceState : " + savedInstanceState);        if(savedInstanceState == null) {            startCamera();        } else {            String str = savedInstanceState.getString("photo_uri");            if(str != null) {                mSavedPicUri = Uri.parse(str);                try {                    mImage.setImageBitmap(BitmapUtil.getResizedBitmap(this, mSavedPicUri, 960, 960));                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    @Override    public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);    }    @Override    public void onClick(View v) {        final File file = new File(mSavedPicUri.getPath());        if (!file.exists()) {            finish();        }        if (v.getId() == R.id.rc_send) {            if (mSavedPicUri != null) {                Intent data = new Intent();                data.setData(mSavedPicUri);                setResult(RESULT_OK, data);            }            finish();        } else if (v.getId() == R.id.rc_back) {            finish();        }    }    private void startCamera() {        Intent intent = new Intent();        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);        File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);        String name = System.currentTimeMillis() + ".jpg";        File file = new File(path, name);        mSavedPicUri = Uri.fromFile(file);        RLog.d(this, "startCamera", "output pic uri =" + mSavedPicUri);        intent.putExtra(MediaStore.EXTRA_OUTPUT, mSavedPicUri);        intent.addCategory(Intent.CATEGORY_DEFAULT);        startActivityForResult(intent, REQUEST_CAMERA);    }    @Override    public void onActivityResult(int requestCode, int resultCode, final Intent data) {        RLog.d(this, "onActivityResult", "resultCode = " + resultCode + ", intent=" + data);        if (resultCode != Activity.RESULT_OK) {            finish();            return;        }        switch (requestCode) {            case REQUEST_CAMERA:                if (resultCode == RESULT_CANCELED) {                    finish();                    Log.e("TakingPicturesActivity","RESULT_CANCELED");                }                if (mSavedPicUri != null && resultCode == Activity.RESULT_OK) {                    try{                        mImage.setImageBitmap(BitmapUtil.getResizedBitmap(this, mSavedPicUri, 960, 960));                    } catch (IOException e) {                        e.printStackTrace();                    }                }                break;            default:                return;        }        super.onActivityResult(requestCode, resultCode, data);    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        //還原        Log.e("TakingPicturesActivity","onRestoreInstanceState");        mSavedPicUri = Uri.parse(savedInstanceState.getString("photo_uri"));        super.onRestoreInstanceState(savedInstanceState);    }    @Override    public void onSaveInstanceState(Bundle outState) {        //儲存        Log.e("TakingPicturesActivity","onSaveInstanceState");        outState.putString("photo_uri", mSavedPicUri.toString());        super.onSaveInstanceState(outState);    }}


2 Demo 代碼中的 NewCameraInputProvider 

此類拍照完成後 直接勾選即表示發出圖片到會話介面 無預覽介面  代碼目前在 融雲官網 Demo 已經開源 io/rong/app/provider/NewCameraInputProvider.java


如果您選擇 方案二的切換方式:

1 將 Demo 中的 io/rong/app/provider/NewCameraInputProvider.java 拷貝到自己工程中 注意一些細節 資源檔等

2 將設定自訂會話介面輸入bar + 號功能自訂註冊的 NewCameraInputProvider  詳情見


這裡解釋一下  第一個數組 是你需要展示哪些功能模組  下面設定的代碼 是你需要你定義的數組功能模組在哪些會話類型展示  這裡提醒一下 語音功能

voip 只支援單對單 設定這個時機在 RongIM.init 初始化以後即可

好了上述文章已經對拍照兩種方案 和 用法做了較為詳細的講述  如果還有哪些細節沒有講到歡迎留言 吐槽


二 相簿 

目前融雲相簿也提供兩種方案   支援: jpeg png jpg bmp 等圖片格式

1 :SDK kit  預設內建 ImageInputProvider  

功能分析: 效果很流暢 載入速度也很快 支援無上限多選圖片發送 和 預覽 ,缺點是 所有手機中的圖片全部在一個 GridView 裡面展示

無多檔案夾選擇 和 最近拍照 

2 :Demo photo 包下代碼開源  核心類 PhotoCollectionsProvider 

功能分析 : 採用 LruChe  緩衝技術 以空間換速度 載入速度快 支援多照片檔案夾選擇 支援最近拍照置頂的排序 代碼開源 可以根據自己

業務需求進行修改   


相簿方案 2 的使用方式 : 

1 將 Demo photo 整個包 拷貝到自己工程下  修改包名 記得資源檔 和 圖片也要拷貝 


2  參考拍照那 調用的圖片  設定 PhotoCollectionsProvider 即可  


此處圖片選擇 有個健壯性的問題沒有解決 有興趣的可以參考一下  http://blog.csdn.net/qq_19986309/article/details/47080287  

如果有預驗證圖片有效性的解決方案 請聯絡筆者 或者 留言  不勝感激


相關連結 最後可以基於 +號功能模組自訂 自己來開發 如 相簿 拍照 地圖 等功能  如果有開發得更好的 功能模組 比如 百度 高德地圖定位 或者 更最佳化

的拍照 相簿選擇的模組願意開源 福利廣大融雲開發人員 請聯絡本人 留言  歡迎 pull request !   end~ 


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

融雲 Android SDK 拍照,圖片選取器方案分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.