Reputation: 163
The application crashes as soon as it is run to the emulator. The main code runs perfectly but when it comes to the implementation in the emulator, it runs and the app crashes. The error is shown below:
2020-07-20 14:05:48.662 9135-9135/com.sam.sabinomeals E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sam.sabinomeals, PID: 9135
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.sam.sabinomeals/net.sam.sabinomeals.SplashActivity}: java.lang.ClassNotFoundException: Didn't find class "net.sam.sabinomeals.SplashActivity" on path: DexPathList[[zip file "/data/app/com.sam.sabinomeals-QJkZ4ORKUV6qLdDBZZ2Jvw==/base.apk"],nativeLibraryDirectories=[/data/app/com.sam.sabinomeals-QJkZ4ORKUV6qLdDBZZ2Jvw==/lib/x86, /system/lib, /system/product/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.ClassNotFoundException: Didn't find class "net.sam.sabinomeals.SplashActivity" on path: DexPathList[[zip file "/data/app/com.sam.sabinomeals-QJkZ4ORKUV6qLdDBZZ2Jvw==/base.apk"],nativeLibraryDirectories=[/data/app/com.sam.sabinomeals-QJkZ4ORKUV6qLdDBZZ2Jvw==/lib/x86, /system/lib, /system/product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1243)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3182)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
The code below is for the splashactivity, it seems to be sure but I think you can still go through it.
package com.sam.sabinomeals
import android.Manifest
import android.app.DatePickerDialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.text.TextUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
import android.view.animation.AnimationUtils
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.textfield.TextInputEditText
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.database.*
import com.google.firebase.iid.FirebaseInstanceId
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
import com.karumi.dexter.PermissionToken
import com.karumi.dexter.listener.PermissionRequest
import com.karumi.dexter.listener.multi.MultiplePermissionsListener
import com.sam.sabinomeals.Remote.ICloudFunctions
import com.sam.sabinomeals.Remote.RetrofitCloudClient
import com.sam.sabinomeals.commons.Common
import com.sam.sabinomeals.models.BraintreeToken
import com.sam.sabinomeals.models.UserModel
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.activity_splash.*
import net.sam.sabinomeals.R
import org.jetbrains.anko.longToast
import org.jetbrains.anko.toast
import java.util.*
class SplashActivity : AppCompatActivity() {
private lateinit var userReference: DatabaseReference
val SPLASH_SCREEN: Long = 5000
lateinit var handler: Handler
private var compositeDisposable: CompositeDisposable?= CompositeDisposable()
lateinit var cloudFunctions: ICloudFunctions
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
cloudFunctions= RetrofitCloudClient.getInstance().create(
ICloudFunctions::class.java)
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN)
userReference = FirebaseDatabase.getInstance().getReference(Common.USER_REFERENCE)
//Animation
val logo_animation = AnimationUtils.loadAnimation(this,
R.anim.top_animation)
val txt_animation = AnimationUtils.loadAnimation(this,
R.anim.bottom_animation)
logo_splash.animation = logo_animation
urbanfood.animation = txt_animation
handler = Handler()
checkInternet()
}
private fun checkInternet() {
Dexter.withActivity(this)
.withPermissions(Manifest.permission.INTERNET,
Manifest.permission.ACCESS_FINE_LOCATION)
.withListener(object :MultiplePermissionsListener{
@RequiresApi(Build.VERSION_CODES.M)
override fun onPermissionsChecked(p0: MultiplePermissionsReport?) {
if (isOnline(this@SplashActivity)) {
// showHome()
val currentUser = FirebaseAuth.getInstance().currentUser
if (currentUser != null) {
checkUserFromFirebase(currentUser)
} else {
longToast("Kindly Login")
showLogin()
}
} else {
longToast("Please ensure you are connected to the Internet")
handler.postDelayed({
finish()
}, SPLASH_SCREEN)
}
}
override fun onPermissionRationaleShouldBeShown(
p0: MutableList<PermissionRequest>?,
p1: PermissionToken?
) {
AlertDialog.Builder(this@SplashActivity)
.setTitle(R.string.internet_permission_title)
.setMessage(R.string.internet_permission_message)
.setNegativeButton(
android.R.string.cancel,
DialogInterface.OnClickListener { dialog, which ->
dialog.dismiss()
p1?.cancelPermissionRequest()
})
.setPositiveButton(
android.R.string.ok,
DialogInterface.OnClickListener { dialog, which ->
dialog.dismiss()
p1?.continuePermissionRequest()
}).show()
}
} ).check()
}
private fun checkUserFromFirebase(currentUser: FirebaseUser) {
userReference.child(currentUser.uid)
.addListenerForSingleValueEvent(object : ValueEventListener {
@RequiresApi(Build.VERSION_CODES.N)
override fun onCancelled(p0: DatabaseError) {
showRegisterDialog(currentUser)
finish()
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onDataChange(p0: DataSnapshot) {
if (p0.exists()) {
val userModel = p0.getValue(UserModel::class.java)
if (userModel != null) {
FirebaseAuth.getInstance().currentUser!!
.getIdToken(true)
.addOnFailureListener{
exception -> Toast.makeText(this@SplashActivity,""+exception.message,Toast.LENGTH_SHORT).show()
}
.addOnCompleteListener{
Common.authorizeToken=it.result!!.token
val headers = HashMap<String,String>()
headers["Authorization"] = Common.buildToken(
Common.authorizeToken)
compositeDisposable!!.add(cloudFunctions.getToken(headers)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({braintreeToken: BraintreeToken? ->
goToHomeActivity(userModel,braintreeToken!!.token)
},{throwable: Throwable? ->
Toast.makeText(this@SplashActivity,""+throwable!!.message,Toast.LENGTH_SHORT).show()
}))
}
}
} else {
showRegisterDialog(currentUser)
}
}
})
}
@RequiresApi(Build.VERSION_CODES.M)
private fun isOnline(context: Context): Boolean {
val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val capabilities =
connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
return true
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
return true
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
return true
}
}
return false
}
private fun showLogin() {
handler.postDelayed({
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}, SPLASH_SCREEN)
}
@RequiresApi(Build.VERSION_CODES.N)
private fun showRegisterDialog(currentUser: FirebaseUser?) {
val builder = AlertDialog.Builder(this)
builder.setTitle("Updated Profile")
builder.setMessage("Please fill in your information")
val itemView = LayoutInflater.from(this)
.inflate(R.layout.layout_register, null)
val edt_name = itemView.findViewById<TextInputEditText>(R.id.edt_name)
val birth_date = itemView.findViewById<TextInputEditText>(R.id.birth_date)
val edt_address = itemView.findViewById<TextInputEditText>(R.id.edt_address)
val edt_phone = itemView.findViewById<TextInputEditText>(R.id.edt_phone)
//setPhone
edt_phone.setText(currentUser!!.phoneNumber)
//Date
birth_date.setOnClickListener(View.OnClickListener {
val c = Calendar.getInstance()
val mYear = c.get(Calendar.YEAR)
val mMonth = c.get(Calendar.MONTH)
val mDay = c.get(Calendar.DAY_OF_MONTH)
val datePickerDialog =
DatePickerDialog(
this,
DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth ->
birth_date.setText("" + dayOfMonth + "/" + month + "/" + year)
},
mYear,
mMonth,
mDay
)
datePickerDialog.show()
})
builder.setView(itemView)
builder.setNegativeButton("Cancel") { dialog, which -> dialog.dismiss() }
builder.setPositiveButton("Record") { dialog, which ->
if (TextUtils.isDigitsOnly(edt_name.text.toString())) {
toast("Enter your name")
return@setPositiveButton
} else if (TextUtils.isDigitsOnly(edt_address.text.toString())) {
toast("Enter your address")
return@setPositiveButton
}
val userModel = UserModel()
userModel.uid = currentUser.uid
userModel.name = edt_name.text.toString()
userModel.address = edt_address.text.toString()
userModel.aniversaire = birth_date.text.toString()
userReference.child(currentUser.uid)
.setValue(userModel)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
FirebaseAuth.getInstance().currentUser!!
.getIdToken(true)
.addOnFailureListener{
exception -> Toast.makeText(this,""+exception.message,Toast.LENGTH_SHORT).show()
}
.addOnCompleteListener{
Common.authorizeToken=it.result!!.token
val headers = HashMap<String,String>()
headers.put("Authorization",
Common.buildToken(
Common.authorizeToken))
compositeDisposable!!.add(cloudFunctions.getToken(headers)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({braintreeToken: BraintreeToken? ->
dialog.dismiss()
goToHomeActivity(userModel, braintreeToken!!.token)
},
{throwable: Throwable? ->
dialog.dismiss()
Toast.makeText(this,""+throwable!!.message,Toast.LENGTH_SHORT).show()
}))
}
}
}
}
//Important
val dialog = builder.create()
dialog.show()
}
private fun goToHomeActivity(
userModel: UserModel?,
token: String
) {
FirebaseInstanceId.getInstance()
.instanceId
.addOnFailureListener { exception ->
Toast.makeText(this,""+exception.message,Toast.LENGTH_SHORT).show()
Common.currentUser= userModel
Common.currentToken=token
startActivity(Intent(this, HomeActivity::class.java))
finish()
}
.addOnCompleteListener { task->
if(task.isSuccessful){
Common.currentUser= userModel
Common.currentToken=token
Common.updateToken(this,task.result!!.token)
startActivity(Intent(this, HomeActivity::class.java))
finish()
}
}
}
}
Upvotes: 0
Views: 412
Reputation: 81539
It's because your AndroidManifest.xml is looking for net.sam.sabinomeals.SplashActivity
, but your activity is actually in com.sam.sabinomeals.SplashActivity
Upvotes: 1