Flower Story is an Android App project that provides flower recognition service.
gradle: 3.2.1
distributionUrl=http\://services.gradle.org/distributions/gradle-4.6-all.zipcompileSdkVersion: 28
buildToolsVersion '28.0.3'
minSdkVersion 21
targetSdkVersion 28implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'Android Version >= 6.0.1-
Use android.hardware.camera2 API for this applications. Please see this demo.
-
About android.hardware.camera2
- Flowchart of Camera2
- Set Brightness
public void setBrightness(double value) {
minCompensationRange = range.getLower();
maxCompensationRange = range.getUpper();
int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange)*(value/100.0f));
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
mCameraCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
}- Zoom
Set mTextureView.setOnTouchListener(textTureOntuchListener);
Override the onTouch() function;
PreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION,Rect);- Get
import okhttp3.*;
import org.json.*;
Request request = new Request.Builder()
.url(URL)
.build();
Call call = new OkHttpClient().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call arg0, IOException e) {…}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonData = response.body().string();
Message.obtain(mUIHandler,GET_FROM_URL,jsonData).sendToTarget();
}
});- Post
import okhttp3.*;
import org.json.*;
OkHttpClient mOkHttpClient = new OkHttpClient();
RequestBody fileBody = RequestBody.create(TYPE, mFile);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(KEY_PARA, VALUE_PARA)
.addFormDataPart(KEY_FILE, VALUE_FILENAME, fileBody)
.build();
Request request = new Request.Builder()
.url(URL)
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call arg0, IOException e) {…}
@Override
public void onResponse(Call call, Response response) throws IOException {
Message.obtain(mUIHandler,MESSAGE_URL,response.body().string()).sendToTarget();
}
});- Lazy Load
public class ItemFragment extends Fragment {
private boolean isFragmentVisible;
private boolean isFirstVisible;
private View rootView;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (rootView == null) return;
if (isFirstVisible && isVisibleToUser) {
onFragmentFirstVisible();
isFirstVisible = false;
}
if (isVisibleToUser) {
onFragmentVisibleChange(true);
isFragmentVisible = true;
return;
}
if (isFragmentVisible()) {
isFragmentVisible = false;
onFragmentVisibleChange(false);
}
}
}- Pagination
mRecyclerView.addOnScrollListener(new RecyclerView .OnScrollListener(){
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState==RecyclerView.SCROLL_STATE_IDLE) {
if(!mAdapter.isFadeTips()&&lastVisibleItem+1== mAdapter.getItemCount()) {
updateRecyclerView(mAdapter.getRealLastPosition(), mAdapter.getRealLastPosition() + PAGE_COUNT);
}
if (mAdapter.isFadeTips() && lastVisibleItem + 2 == mAdapter.getItemCount()) {
updateRecyclerView(mAdapter.getRealLastPosition(), mAdapter.getRealLastPosition()+PAGE_COUNT);
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem= mLayoutManager.findLastVisibleItemPosition();
}
});If you have any problem, please contact challvy.tee@gmail.com.


