【问题标题】:Android MongoDB Atlas - Error using connection url stringAndroid MongoDB Atlas - 使用连接 url 字符串时出错
【发布时间】:2026-01-27 00:05:04
【问题描述】:

我正在尝试通过 android 意图中的 java 代码连接到 MongoDB - Atlas,代码发布在下面,但我遇到了有关连接字符串的错误:

public class MongoDBConnectionActivity extends AppCompatActivity {
    private String url = "mongodb+srv://armand:[pasword]@cluster0.alzjc.mongodb.net/ism?retryWrites=true&w=majority";
    private String db = "ism";
    private String collection = "students";
    TextView tV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mongo_d_b_connection);
        tV = findViewById(R.id.textView4);
    }

    public void connectDB(View view) {
        connect();
    }



    public void connect() {
        MongoDBConnectionManager task = new MongoDBConnectionManager();
        task.execute(new String[]{url,db,collection});
    }
    private class MongoDBConnectionManager extends AsyncTask<String, Void, Boolean> {
        MongoClientURI uri;
        MongoClient mongoClient;
        MongoDatabase database;
        MongoCollection<Document> coll;
        private boolean result = false;
        //ProgressBar pb = new ProgressBar(MongoDBConnectionActivity.this);
        ProgressDialog pDialog = new ProgressDialog(MongoDBConnectionActivity.this);
        @Override
        protected void onPreExecute() {
            pDialog.setMessage("Reading Data...");
            pDialog.show();
        }

        @Override
        protected Boolean doInBackground(String... strings) {
        /*
        MongoClientURI uri = new MongoClientURI("mongodb://username:password@www.example.com:12345/db-name" );
        MongoClient mongoClient = new MongoClient(uri);
        MongoDatabase db = mongoClient.getDatabase(uri.getDatabase());
        */
            String url = strings[0];
            String db = strings[1];
            String collection = strings[2];
            ExampleDialog dialog = new ExampleDialog(url,db,collection);
            dialog.show(getSupportFragmentManager(), "example dialog");
            try {
                uri = new MongoClientURI(url);
                mongoClient = new MongoClient(uri);
                database = mongoClient.getDatabase(db);
                coll = database.getCollection(collection);
                Document first = coll.find().first();
                tV.setText(first.toJson());
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result){

        if(result)
            pDialog.dismiss();
        else
            pDialog.setMessage("Error!");
        }


    /*
    onPreExecute() -> Before background check ( like opening connection to the database we need to show something on screen
    an animation like a progress bar
    doInBackground(Params) -> here we start connection to the databases, Operations here should stay away from main thread
    onProgressUpdate(Progress…) -> updating information Like the animation of the progress bar based
    onPostExecute(Result) -> we updated the ui with the result
     */
    }
}

这是错误:

W/System.err: java.lang.IllegalArgumentException: uri needs to start with mongodb://
W/System.err:     at com.mongodb.ConnectionString.<init>(ConnectionString.java:196)
        at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:163)
        at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:150)
        at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:69)
        at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:42)
        at android.os.AsyncTask$2.call(AsyncTask.java:316)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
W/System.err:     at java.lang.Thread.run(Thread.java:776)
I/art: Do partial code cache collection, code=59KB, data=60KB
I/art: After code cache collection, code=59KB, data=60KB

我不明白为什么会返回此问题,因为在运行 java 程序时它工作得很好,而且我使用的连接器与我在 java 项目中使用的连接器相同,只是这里是通过使用 gradle 提供的:

implementation 'org.mongodb:mongo-java-driver:3.12.8'

如果我从连接字符串中删除 +srv 错误是巨大的:

W/art: Unresolved exception class when finding catch block: javax.naming.NamingException
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.example.helloworld, PID: 3802
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:330)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:776)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
        at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150)
        at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112)
        at com.mongodb.ConnectionString.<init>(ConnectionString.java:382)
        at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:257)
        at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:239)
        at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:69)
        at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:42)
        at android.os.AsyncTask$2.call(AsyncTask.java:316)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
        at java.lang.Thread.run(Thread.java:776) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.directory.InitialDirContext" on path: DexPathList[[zip file "/data/app/com.example.helloworld-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.helloworld-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150) 
        at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112) 
        at com.mongodb.ConnectionString.<init>(ConnectionString.java:382) 
        at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:257) 
        at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:239) 
        at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:69) 
        at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:42) 
        at android.os.AsyncTask$2.call(AsyncTask.java:316) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
        at java.lang.Thread.run(Thread.java:776) 
I/Process: Sending signal. PID: 3802 SIG: 9
Connected to process 3984 on device 'huawei-eva_l19-XVVFL17619000004'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/System: ClassLoader referenced unknown path: /data/app/com.example.helloworld-2/lib/arm64
I/HwCust: Constructor found for class android.app.HwCustActivityImpl
I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
        at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2678)
        at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:63)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:656)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:798)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:738)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:869)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:832)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
        at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:896)
        at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:806)
I/art:     at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:693)
        at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:170)
        at void com.example.helloworld.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:23)
        at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6915)
        at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1123)
        at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2746)
        at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2864)
        at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
        at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1567)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
        at void android.os.Looper.loop() (Looper.java:156)
        at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
        at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:942)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:832)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.helloworld-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.helloworld-2/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
        at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2678)
        at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:63)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:656)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:798)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:738)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:869)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:832)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
        at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:896)
        at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:806)
        at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:693)
        at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:170)
        at void com.example.helloworld.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:23)
        at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6915)
        at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1123)
        at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2746)
        at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2864)
        at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
        at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1567)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
        at void android.os.Looper.loop() (Looper.java:156)
        at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
        at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:942)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:832)
W/VRSystemServiceManager: vr service is not alive
I/HwSecImmHelper: mSecurityInputMethodService is null
I/HwPointEventFilter: support AFT
I/OpenGLRenderer: Initialized EGL, version 1.4
W/linker: /vendor/lib64/libhwuibp.so: unused DT entry: type 0xf arg 0xe3a
I/art: Do partial code cache collection, code=22KB, data=30KB
    After code cache collection, code=22KB, data=30KB
I/art: Increasing code cache capacity to 128KB

【问题讨论】:

    标签: java android mongodb gradle mongodb-atlas


    【解决方案1】:

    我发现其中一个问题是我失踪了但现在又找到了一个:D

    W/System.err: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=cluster0.alzjc.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoException: java.lang.SecurityException: Permission denied (missing INTERNET permission?)}, caused by {java.lang.SecurityException: Permission denied (missing INTERNET permission?)}, caused by {android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)}, caused by {android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)}}]
    W/System.err:     at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:182)
    

    【讨论】: