我先說一下,安卓系統的預設的機制,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....