Reputation: 11
let's see if I explain myself correctly, I am trying to implement subscriptions in an application on android studio for the first time, the structure is this:
splash.java -> SubscriptionActivity.java -> MainActivity.java
The user opens the app, shows the splashscreen, then the subscription screen with 5 different plans should appear and after paying the subscription they can access MainActivity.java.
It's my first time doing this and I just see that Google asks that subscriptions be with the new api, I have searched everywhere but I can't do the SubscriptionActivity.java correctly, "is deprecated" appears in several sections and no matter how hard I try To understand the Google guide, I can't update it, I leave you my code and I hope you can please help me.
thank you
Build.gradle
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'org.jetbrains.kotlin.android'
android {
compileSdk 34
defaultConfig {
applicationId "com.one.two.tree"
minSdkVersion 24
targetSdkVersion 34
versionCode 96
versionName "9.6.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
buildFeatures{
viewBinding = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
apiVersion = '1.1'
languageVersion = '1.1'
}
buildFeatures {
viewBinding true
}
namespace 'com.one.two.tree'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.material:material:1.2.1'
implementation 'com.google.firebase:firebase-messaging:22.6.0'
implementation 'com.google.firebase:firebase-core:18.0.2'
implementation 'androidx.core:core-ktx:+'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.8'
implementation 'com.daimajia.numberprogressbar:library:1.4@aar'
implementation 'com.google.android.gms:play-services-ads:22.5.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.turki-alkhateeb:materialcolorpicker:1.0.7'
implementation platform('com.google.firebase:firebase-bom:25.12.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'androidx.work:work-runtime:2.7.1'
implementation 'com.google.android.ads.consent:consent-library:1.0.8'
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:30.1.0')
// Declare the dependencies for the In-App Messaging and Analytics libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation 'com.google.firebase:firebase-inappmessaging-display'
def lifecycle_version = "2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
implementation 'com.google.android.ump:user-messaging-platform:2.0.0'
dependencies {
def billing_version = "6.0.1"
implementation "com.android.billingclient:billing:$billing_version"
}
implementation "com.android.billingclient:billing-ktx:4.0.0"
//implementation 'com.onesignal:OneSignal:[4.0.0, 4.99.99]'
}
splash.java
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.ads.consent.ConsentForm;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.FullScreenContentCallback;
import com.google.android.gms.ads.LoadAdError;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
import com.google.android.gms.ads.interstitial.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
public class splash extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
{
startActivity(new Intent(splash.this,SubscriptionActivity.class));
finish();
}
}
}, 5000);
}
}
SubscriptionActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import java.util.ArrayList;
import java.util.List;
public class SubscriptionActivity extends AppCompatActivity {
private BillingClient billingClient;
private List<SkuDetails> skuDetailsList;
private TextView subscriptionTitleTextView;
private TextView subscriptionPriceTextView;
private Button[] subscribeButtons = new Button[5]; // Botones para las 5 suscripciones
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subscription);
subscriptionTitleTextView = findViewById(R.id.subscription_title);
subscriptionPriceTextView = findViewById(R.id.subscription_price);
// Encuentra tus botones para las suscripciones
subscribeButtons[0] = findViewById(R.id.subscribe_button1);
subscribeButtons[1] = findViewById(R.id.subscribe_button2);
subscribeButtons[2] = findViewById(R.id.subscribe_button3);
subscribeButtons[3] = findViewById(R.id.subscribe_button4);
subscribeButtons[4] = findViewById(R.id.subscribe_button5);
setupBillingClient();
querySkuDetails();
// Configura OnClickListener para los botones de suscripción
for (int i = 0; i < subscribeButtons.length; i++) {
final int index = i;
subscribeButtons[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initiatePurchase(index);
}
});
}
}
private void setupBillingClient() {
billingClient = BillingClient.newBuilder(this)
.enablePendingPurchases()
.setListener(purchasesUpdatedListener)
.build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
// El cliente de facturación está listo
}
}
@Override
public void onBillingServiceDisconnected() {
// Manejar la desconexión del cliente de facturación
}
});
}
private void querySkuDetails() {
List<String> skuList = new ArrayList<>();
skuList.add("noads");
skuList.add("bronze");
skuList.add("silver");
skuList.add("gold");
skuList.add("diamond");
SkuDetailsParams.Builder paramsBuilder = SkuDetailsParams.newBuilder();
paramsBuilder.setSkusList(skuList);
paramsBuilder.setType(BillingClient.SkuType.SUBS);
SkuDetailsParams params = paramsBuilder.build();
billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> detailsList) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && detailsList != null) {
skuDetailsList = detailsList;
// Puedes mostrar las opciones de suscripción aquí si es necesario
showSubscriptionOptions();
}
}
});
}
private void showSubscriptionOptions() {
for (int i = 0; i < subscribeButtons.length; i++) {
if (skuDetailsList.size() > i) {
subscribeButtons[i].setText(skuDetailsList.get(i).getTitle() + " - " + skuDetailsList.get(i).getPrice());
subscribeButtons[i].setVisibility(View.VISIBLE);
} else {
subscribeButtons[i].setVisibility(View.GONE);
}
}
}
private void initiatePurchase(int index) {
if (skuDetailsList != null && index < skuDetailsList.size()) {
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsList.get(index))
.build();
billingClient.launchBillingFlow(this, flowParams);
}
}
private final PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, List<Purchase> purchases) {
// Lógica para manejar la respuesta de la compra
}
};
}
activity_subscription.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=".SubscriptionActivity">
<!-- Imagen en la parte superior -->
<ImageView
android:id="@+id/imageViewTop"
android:layout_width="0dp"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@drawable/icono"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<!-- Texto debajo de la imagen -->
<!-- Precio de la suscripción -->
<TextView
android:id="@+id/subscription_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="Subscription Title"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageViewTop"
app:layout_constraintVertical_bias="0.184" />
<TextView
android:id="@+id/subscription_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Subscription Price"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/subscription_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp" />
<!-- Botones para las suscripciones -->
<Button
android:id="@+id/subscribe_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Subscribe 1"
app:layout_constraintTop_toBottomOf="@id/subscription_price"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="24dp"
android:visibility="visible" />
<Button
android:id="@+id/subscribe_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Subscribe 2"
app:layout_constraintTop_toBottomOf="@id/subscribe_button1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"
android:visibility="visible" />
<Button
android:id="@+id/subscribe_button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Subscribe 3"
app:layout_constraintTop_toBottomOf="@id/subscribe_button2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"
android:visibility="visible" />
<Button
android:id="@+id/subscribe_button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Subscribe 4"
app:layout_constraintTop_toBottomOf="@id/subscribe_button3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"
android:visibility="visible" />
<Button
android:id="@+id/subscribe_button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Subscribe 5"
app:layout_constraintTop_toBottomOf="@id/subscribe_button4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"
android:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>
in SubscriptionActivity.java it tells me "is deprecated" and I don't know how to fix it, not even by reading the documentation.
The error says it in:
Upvotes: 0
Views: 264