Android中相機與相簿的詳細使用

2021-09-12 11:27:47 字數 4081 閱讀 7563

我先說一下,安卓系統的預設的機制,intent觸發camera程式,拍好**後,將會返回資料,但是考慮到記憶體問題,camera不會將全尺寸的影象返回給呼叫的activity,一般情況下,有可能返回的是縮圖,比如120*160px。這看起來就像是乙個縮圖一樣了,這樣的效果是讓我們非常不滿意的,因為我們想要上傳的明明是乙個高畫質的,但是這樣我們上傳的竟然是乙個特別模糊的啦,所以我們不能採用這種辦法了。

我們的思路:呼叫系統相機,拍照完將拍完的**存在sd卡的某乙個地方,然後我們呼叫自己的剪裁工具,不呼叫系統的剪裁工具了,這樣我們剪裁完的也就是一張高畫質的了,這樣就完美的解決了所遇到的問題。

這款工具,特別的小巧,自定義功能非常強,我在專案中是這樣用的:

//裁剪後的絕對路徑

string camerascalepath = outfile.getabsolutepath();

uri destinationuri = uri.fromfile(outfile);

ucrop ucrop = ucrop.of(sourceuri, destinationuri);

//初始化ucrop配置

ucrop.options options = new ucrop.options();

//設定裁剪可操作的手勢

options.setallowedgestures(ucropactivity.scale, ucropactivity.rotate, ucropactivity.all);

//是否隱藏底部容器,預設顯示

options.sethidebottomcontrols(true);

//設定*******顏色

options.set*******color(activitycompat.getcolor(activity, r.color.colorprimary));

//設定狀態列顏色

options.setstatusbarcolor(activitycompat.getcolor(activity, r.color.colorprimary));

//是否能調整裁剪框

options.setfreestylecropenabled(true);

//ucrop配置

ucrop.withoptions(options);

ucrop.withaspectratio(aspectratiox, aspectratioy);

//跳轉裁剪頁面

看了之後,應該不用我說這個庫有多強大了吧,通過簡單的設定之後,可以輕鬆的實現的旋轉啊,的縮放啊,和各種實用的操作,特別的實用。

下面展示一下我們呼叫系統的拍照,和系統的相簿的**:

/**

* 啟動手機相簿

*/private void fromgallery() else

}/**

* 啟動手機相機

*/private void fromcamera() else

}

//如果我們採取的是,呼叫相簿中的**,我們只需要這樣便可以獲取到,並且直接載入到我們的第三方剪裁庫裡面。

string url = getpath(releaseorderactivity.this, data.getdata());

log.i("lin", "----lin---- url :" + url);

startucrop(releaseorderactivity.this, url, 1000, 300, 300);

//如果我們採用的是呼叫系統的相機的話,採用這種方式便可以獲取到**,並且載入到我們的剪裁的工具裡面啦。

startucrop(releaseorderactivity.this, environment.getexternalstoragedirectory() + "/" + image_name, 1000, 300, 300);

//以下是關鍵,原本uri返回的是file:///...來著的,android4.4返回的是content:///...

@suppresslint("newapi")

public static string getpath(final context context, final uri uri)

}// downloadsprovider

else if (isdownloadsdocument(uri))

// mediaprovider

else if (ismediadocument(uri)) else if ("video".equals(type)) else if ("audio".equals(type))

final string selection = "_id=?";

final string selectionargs = new string;

return getdatacolumn(context, contenturi, selection, selectionargs);}}

// mediastore (and general)

else if ("content".equalsignorecase(uri.getscheme()))

return getdatacolumn(context, uri, null, null);

}// file

else if ("file".equalsignorecase(uri.getscheme()))

return null;

}public static string getdatacolumn(context context, uri uri, string selection, string selectionargs) ;

try

} finally

}return null;

}/**

* @param uri the uri to check.

* @return whether the uri authority is externalstorageprovider.

*/public static boolean i***ternalstoragedocument(uri uri)

/*** @param uri the uri to check.

* @return whether the uri authority is downloadsprovider.

*/public static boolean isdownloadsdocument(uri uri)

/*** @param uri the uri to check.

* @return whether the uri authority is mediaprovider.

*/public static boolean ismediadocument(uri uri)

/*** @param uri the uri to check.

* @return whether the uri authority is google photos.

*/public static boolean isgooglephotosuri(uri uri)

好了,以上便是我們的解決方案了。

android 開啟相機和相簿

開啟相簿和相機有多種方式,目前收集到兩種方式 一種是來自環信程式設計師,一種是來自網路。不知道他們的區別在 反正都可以實現相應的功能。1 環信 照相獲取 選擇檔案 private void selectfilefromlocal else startactivityforresult intent,...

Android 8 0 呼叫相機相簿

近期專案的需求是需要去呼叫相機相簿去拍照獲取儲存到伺服器 公司的測試機試android6.0以下的 所以之前呼叫相機一點都沒問題 可是跑在android8.0 的手機上 呼叫相機相簿就會出現錯誤 暴露的url android 6.0動態訪問許可權 相機為例 android resource xml ...

Android呼叫相機,錄影,相簿

我們在安卓開發過程中,可能會遇到需要用到 的情況,今天就說一下如何使用相機,相簿這些系統軟體的呼叫方法 首先我們將許可權新增 android name android.permission.write external storage android name android.permission....