MeetAp Bootcamp Week #6 CRUD dengan Fast Android Networking
Membuat VideoApp dari NOL dengan Android Studio
Mentor : ELTE Dev
Notilen : Ilham Maulana
Buat project Baru
Nama Project : videoapp
Tambahkan Library
implementation 'com.android.support:design:28.0.0';
Update Activity_main.xml
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:textSize="14sp"
android:inputType="text"
android:maxLines="1"
android:id="@+id/txtTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
Buat folder imagefolder di server
buat file index.php
<?php
$result = array("success" => $_FILES["video"]["name"]);
$file_path = basename( $_FILES['video']['name']);
if(move_uploaded_file($_FILES['video']['tmp_name'], $file_path)) {
$result = array("success" => "File successfully uploaded");
} else{
$result = array("success" => "error uploading file");
}
echo json_encode($result, JSON_PRETTY_PRINT);
?>
rest api + php
Tambahkan yang lainnya
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:textSize="14sp"
android:inputType="text"
android:maxLines="1"
android:id="@+id/txtTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:textSize="14sp"
android:inputType="text"
android:maxLines="1"
android:id="@+id/txtDurasi"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:textSize="14sp"
android:inputType="text"
android:maxLines="1"
android:id="@+id/txtRilis"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:textSize="14sp"
android:inputType="text"
android:maxLines="1"
android:id="@+id/txtGenre"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
Hasilnya
Tutorial
Tambahkan Library di gradle
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.okhttp3:okhttp:3.2.0'
implementation 'com.squareup.okio:okio:1.7.0'
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.1'
implementation 'pub.devrel:easypermissions:0.2.0'
String.xml
<resources>
<string name="app_name">Record Video and Upload to Server</string>
<string name="upload_video">UPLOAD VIDEO</string>
<string name="read_file">This app needs access to your file storage so that it can read video.</string>
</resources>
Color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="colorBlack">#000000</color>
<color name="colorWhite">#ffffff</color>
</resources>
android_manifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" android:required="true" />
Tambahkan VideoView di activity_main.xml
<VideoView
android:layout_weight="1"
android:background="@color/colorWhite"
android:id="@+id/videoDisplay"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Tambahkan Button
<Button
android:id="@+id/capture_video"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/colorWhite"
android:text="@string/upload_video"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:background="@color/colorPrimary"/>
Tampilan Desain
What Interface ?
Buat VideoInterface
import okhttp3.MultipartBody;
import retrofit2.Call;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
public interface VideoInterface {
@Multipart
@POST("/imagefolder/index.php")
Call<ResultObject> uploadVideoToServer(@Part MultipartBody.Part video);
}
Multipart???
Multipart is a container that holds multiple body parts. Multipart provides methods to retrieve and set its subparts.
translate ke google translate
Buat class ResultObject
public class ResultObject {
private String success;
public ResultObject(String success) {
this.success = success;
}
public String getSuccess() {
return success;
}
}
Main_activity.java
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
klo ada error, klik alt + enter , menjadi :
package com.example.videoapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.List;
import pub.devrel.easypermissions.EasyPermissions;
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
}
}
main_activity.java
package com.example.videoapp;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.VideoView;
import java.io.File;
import java.util.List;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import pub.devrel.easypermissions.EasyPermissions;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
private static final String TAG = MainActivity.class.getSimpleName();
private static final int REQUEST_VIDEO_CAPTURE = 300;
private static final int READ_REQUEST_CODE = 200;
private Uri uri;
private String pathToStoredVideo;
private VideoView displayRecordedVideo;
private static final String SERVER_PATH = "http://malea.id/rest_api_server/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayRecordedVideo = (VideoView)findViewById(R.id.video_display);
Button captureVideoButton = (Button)findViewById(R.id.capture_video);
captureVideoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent videoCaptureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if(videoCaptureIntent.resolveActivity(getPackageManager()) != null){
startActivityForResult(videoCaptureIntent, REQUEST_VIDEO_CAPTURE);
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == Activity.RESULT_OK && requestCode == REQUEST_VIDEO_CAPTURE){
uri = data.getData();
if(EasyPermissions.hasPermissions(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)){
displayRecordedVideo.setVideoURI(uri);
displayRecordedVideo.start();
pathToStoredVideo = getRealPathFromURIPath(uri, MainActivity.this);
Log.d(TAG, "Recorded Video Path " + pathToStoredVideo);
//Store the video to your server
uploadVideoToServer(pathToStoredVideo);
}else{
EasyPermissions.requestPermissions(MainActivity.this, getString(R.string.read_file), READ_REQUEST_CODE, Manifest.permission.READ_EXTERNAL_STORAGE);
}
}
}
private String getFileDestinationPath(){
String generatedFilename = String.valueOf(System.currentTimeMillis());
String filePathEnvironment = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
File directoryFolder = new File(filePathEnvironment + "/video/");
if(!directoryFolder.exists()){
directoryFolder.mkdir();
}
Log.d(TAG, "Full path " + filePathEnvironment + "/video/" + generatedFilename + ".mp4");
return filePathEnvironment + "/video/" + generatedFilename + ".mp4";
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, MainActivity.this);
}
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
if(uri != null){
if(EasyPermissions.hasPermissions(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)){
displayRecordedVideo.setVideoURI(uri);
displayRecordedVideo.start();
pathToStoredVideo = getRealPathFromURIPath(uri, MainActivity.this);
Log.d(TAG, "Recorded Video Path " + pathToStoredVideo);
//Store the video to your server
uploadVideoToServer(pathToStoredVideo);
}
}
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.d(TAG, "User has denied requested permission");
}
private void uploadVideoToServer(String pathToVideoFile){
File videoFile = new File(pathToVideoFile);
RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile);
MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SERVER_PATH)
.addConverterFactory(GsonConverterFactory.create())
.build();
VideoInterface vInterface = retrofit.create(VideoInterface.class);
Call<ResultObject> serverCom = vInterface.uploadVideoToServer(vFile);
serverCom.enqueue(new Callback<ResultObject>() {
@Override
public void onResponse(Call<ResultObject> call, Response<ResultObject> response) {
ResultObject result = response.body();
if(!TextUtils.isEmpty(result.getSuccess())){
Toast.makeText(MainActivity.this, "Result " + result.getSuccess(), Toast.LENGTH_LONG).show();
Log.d(TAG, "Result " + result.getSuccess());
}
}
@Override
public void onFailure(Call<ResultObject> call, Throwable t) {
Log.d(TAG, "Error message " + t.getMessage());
}
});
}
private String getRealPathFromURIPath(Uri contentURI, Activity activity) {
Cursor cursor = activity.getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) {
return contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
}
}
buat folder imagefolder
buat file index.php
<?php
$result = array("success" => $_FILES["video"]["name"]);
$file_path = basename( $_FILES['video']['name']);
if(move_uploaded_file($_FILES['video']['tmp_name'], $file_path)) {
$result = array("success" => "File successfully uploaded");
} else{
$result = array("success" => "error uploading file");
}
echo json_encode($result, JSON_PRETTY_PRINT);
?>
dbConnect.php
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','video_app');
$con = mysqli_connect(HOST,USER,PASS,DB) or die('Unable to Connect');
insert.php
<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
$response = array();
//mendapatkan data
$npm = $_POST['title'];
$nama = $_POST['durasi'];
$kelas = $_POST['genre'];
$sesi = $_POST['rilis'];
$video = $_POST['video'];
require_once('dbConnect.php');
//Cek npm sudah terdaftar apa belum
$sql = "INSERT INTO video
(title,durasi,genre,rilis, video)
VALUES('$title','$durasi','$genre','$rilis','$video)";
if(mysqli_query($con,$sql)) {
$response["value"] = 1;
$response["message"] = "Sukses mendaftar";
echo json_encode($response);
} else {
$response["value"] = 0;
$response["message"] = "oops! Coba lagi!";
echo json_encode($response);
}
// tutup database
mysqli_close($con);
} else {
$response["value"] = 0;
$response["message"] = "oops! Coba lagi!";
echo json_encode($response);
}
fast android networking
Using Fast Android Networking Library in your application
Add this in your build.gradle
implementation 'com.amitshekhar.android:android-networking:1.0.2'
Do not forget to add internet permission in manifest if already not present
<uses-permission android:name="android.permission.INTERNET" />
Then initialize it in onCreate() Method of application class :
AndroidNetworking.initialize(getApplicationContext());
Membuat VideoApp dari NOL dengan Android Studio
By Maulana Ilham
Membuat VideoApp dari NOL dengan Android Studio
- 988