Redirect App solusi terbaik saat aplikasi di suspend

Redirect App solusi terbaik saat aplikasi di suspend

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Hallo om pengguna Source Code Aliendroid, Pernah tidak merasa nyesek saat aplikasi yang sedang naik daun, banyak downlaod, iklan cpm besar dan tiba-tiba aplikasi kita di suspend oleh google. Sakit sangat! Selama ini solusi yang sering dilakukan adalah melakukan banding tapi kemungkinan aplikasi dikembalikan itu 50:50 tergantung dari pelanggaran. Atau jika tidak dikembalikan, biasanya sang developer upload aplikasi baru di akun gdev yang sama/beda.

Upload aplikasi baru memang solusi, akan tetapi kita perlu promosi ulang untuk mendapatkan downloader yang sudah pasti memakan waktu. Dari pengalaman kami dan permintaan pengguna jasa reskin aliendroid, akhirnya kami membuat metode dengan nama redirect App. Redirect App berfungsi untuk melakukan pengalihan link dan mengunci aplikasi yang sudah di suspend. Jadi jika ada pengguna 10.000 di aplikasi kita dan aplikasi di suspend, kita bisa melakukan pengalihan ke aplikasi baru kita dan aplikasi akan terkunci. Jadi mau tidak mau pengguna akan download ulang aplikasi (jika aplikasinya memang layak untuk di downlaod ulang).

Untuk melakukan redirect, kita membutuhkan Json sebagai penyimpan link dan kondisi saat suspend, serta libs Volley untuk memanggil rest Api Json ke aplikasi yang dibuat. Silahkan buat aplikasi daru dengan mempersiapkan 2 layout (acitivty_main.xml, activity_splash.xml) dan 2 activity (MainActivity.java dan SplashActivity.java).

build.gradle : Module

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.aliendroid.latihanredirectapp"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13.1'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    implementation 'com.android.volley:volley:1.1.1'
}

splash_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#303952"
    android:orientation="vertical">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/progress"
        android:layout_centerHorizontal="true"
        android:text="Loading data..."
        android:textColor="#c8ffffff" />

    <ProgressBar
        android:id="@+id/progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="250dp"
        android:layout_height="25dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="45dp"
        android:indeterminate="true"
        android:max="100" />

</RelativeLayout>

SplashActivity.java

package com.aliendroid.latihanredirectapp;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        
        if (checkConnectivity()){
            loadUrlData();
        }
        
        new CountDownTimer(5000, 1000) {
            @Override
            public void onFinish() {
                Intent intent = new Intent(getBaseContext(), MainActivity.class);
                startActivity(intent);
                finish();
            }
            @Override
            public void onTick(long millisUntilFinished) {

            }
        }.start();

    }
    private void loadUrlData() {
        final ProgressDialog progressDialog = new ProgressDialog(SplashActivity.this);
        progressDialog.setMessage("Loading...");
        progressDialog.show();

        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                MainActivity.URL_DATA, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                progressDialog.dismiss();

                try {

                    JSONObject jsonObject = new JSONObject(response);
                    JSONArray array = jsonObject.getJSONArray("Redirect");
                    for (int i = 0; i < array.length(); i++){
                        JSONObject c = array.getJSONObject(i);
                        MainActivity.STATUS = c.getString("status");
                        MainActivity.LINK = c.getString("link");

                    }
                    
                } catch (JSONException e) {

                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(SplashActivity.this, "Error" + error.toString(), Toast.LENGTH_SHORT).show();
            }
        });

        RequestQueue requestQueue = Volley.newRequestQueue(SplashActivity.this);
        requestQueue.add(stringRequest);
    }
    
    private boolean checkConnectivity() {
        ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if ((info == null || !info.isConnected() || !info.isAvailable())) {
            return false;
        } else {
            return true;
        }
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.aliendroid.latihanredirectapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    public static String URL_DATA = "http://webanda.com/inifile.json";
    public static String LINK = "https://play.google.com/store/apps/details?id";
    public static String STATUS = "0";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (STATUS.equals("1")) {
            String str = LINK;
            startActivity(new Intent(Intent.ACTION_VIEW,
                    Uri.parse(str)));
            finish();
        }

    }
}

SplashActivity.java diperlukan sebagai media load data dari json sebelum data dikirm ke MainAcvtivity.java. Baris code public static String STATUS = "0"; adalah fungsi dari redirect, yang jika di ubah menjadi angka "1" maka akan menutup aplikasi dan mengarahkan ke link aplikasi baru dengan bantuan code public static String LINK = "https://play.google.com/store/apps/details?id". Kedua baris code ini akan berfungsi jika menggunakan Json secara online. Untuk itu anda wajib memiliki hosting untuk menyimpan json, atau bisa menggunakan media penyimpan gratis seperti archive.org, google site, dll. 

Silahkan upload file redirect.json yang telah disediakan oleh penulis. Secara default gunakan "status": "0" jika aplikasi masih live, dan "status": "1" jika aplikasi anda di suspend, maka aplikai akan mati dan melakukan redirect ke link aplikasi baru. Lalu isi  "link": "https://play.google.com/store/apps/details?id=" dengan link aplikasi baru anda.

redirect.json


    "Redirect": [
        {
        "status": "0",
        "link": "https://play.google.com/store/apps/details?id="
        }
    ]
}

Sampai tahap ini pembuatan redirect app sudah selesai, selanjutnya silahkan edit bagian AndroidManifest.xml untuk konfigurasi activity awal yang muncul setelah icon di klik di Home Android.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.aliendroid.latihanredirectapp">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:networkSecurityConfig="@xml/network_config"
        android:usesCleartextTraffic="true"
        android:theme="@style/Theme.LatihanRedirectApp">
        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
        </activity>
    </application>

</manifest>

Pada bagian manifest, penulis menambahkan code  android:usesCleartextTraffic="true" dan android:networkSecurityConfig="@xml/network_config", kedua code ini berfungsi untuk konfigurasi Android 10 yang tidak melakukan load pada json. Silahkan anda buat folder baru dengan nama xml dengan hirarki res-xml-network_config.xml

network_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Dan tutorial pun selesai, jika anda belum punya hosting silahkan uji coba secara offline dengan cara mengubah  public static String STATUS = "1". Run dan lihat hasilnya, aplikasi akan close dan melakukan redirect ke link yang anda siapkan.

Pesan Hosting Tanpa Domain
Bagi pembaca yang tidak memilik hosting dan ingin sewa tanpa beli domain, silahkan orde di https://cloud.aliendro.id/Aliencloud.

  • user

    Ali Maruf

    SALUT sama sampean om.. walaupun sampean jualan sc tp, sampean gak pelit berbagi yg baca comment ini pasti taulah kenapa?

    11 days ago