java - 在 Android 应用程序上设置头像

标签 java android android-camera avatar

我想让用户在设置用户信息时创建一个头像(如果您愿意,可以创建个人资料图片)。我创建了一种用于单击/触摸的方法,该方法会要求用户拍照,另一种方法是长按/触摸,该方法会要求用户从其图库中选择一张图片。

以下是我的类文件中的方法:

public void onLaunchCamera(View v) {

    avatarButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String strAvatarPrompt = "Take your picture to store as your avatar!";
            Intent pictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(Intent.createChooser(pictureIntent, strAvatarPrompt), TAKE_AVATAR_CAMERA_REQUEST);
        }
    });

    avatarButton.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View v) {
            String strAvatarPrompt = "Choose a picture to use as your avatar!";
            Intent pickPhoto = new Intent(Intent.ACTION_PICK);
            pickPhoto.setType("image/*");
            startActivityForResult(Intent.createChooser(pickPhoto, strAvatarPrompt), TAKE_AVATAR_GALLERY_REQUEST);
            return true;
        }
    });
    }

下面是与 ImageButton 关联的 XML:

<ImageButton
            android:id="@+id/ImageButton_Avatar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:maxHeight="@dimen/avatar_size"
            android:minHeight="@dimen/avatar_size"
            android:onClick="onLaunchCamera"
            android:scaleType="fitXY"
            android:src="@drawable/avatar"></ImageButton>

当我单击 ImageButton 时,它会崩溃,但我不知道为什么。有什么想法吗?

谢谢

编辑:添加下面的 logcat(对格式感到抱歉。无法弄清楚如何正确排序:

[ 04-12 18:32:50.989  5901: 5901 D/         ]
HostConnection::get() New     Host Connection established 0xb8a44530, tid 5901
04-12 18:32:51.039 5901-5901/cct.mad.lab D/OpenGLRenderer: Enabling debug mode 0
04-12 18:32:55.739 5901-5901/cct.mad.lab V/RenderScript: 0xb8c53300     Launching thread(s), CPUs 2
04-12 18:32:57.389 5901-5901/cct.mad.lab D/AndroidRuntime: Shutting down VM
04-12 18:32:57.389 5901-5901/cct.mad.lab W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xb0d2db20)
04-12 18:32:57.399 5901-5901/cct.mad.lab E/AndroidRuntime: FATAL EXCEPTION: main
Process: cct.mad.lab,     PID: 5901                                                        java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:3823)
                                                           at   android.view.View.performClick(View.java:4438)
                                                           at  android.view.View$PerformClick.run(View.java:18422)
                                                            at a   android.os.Handler.handleCallback(Handler.java:733)
                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                           at android.os.Looper.loop(Looper.java:136)
                                                           at android.app.ActivityThread.main(ActivityThread.java:5017)
                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                           at java.lang.reflect.Method.invoke(Method.java:515)
                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                           at dalvik.system.NativeStart.main(Native Method)
                                                        Caused by: java.lang.reflect.InvocationTargetException
                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                           at java.lang.reflect.Method.invoke(Method.java:515)
                                                           at android.view.View$1.onClick(View.java:3818)
                                                           at android.view.View.performClick(View.java:4438) 
                                                           at android.view.View$PerformClick.run(View.java:18422) 
                                                           at android.os.Handler.handleCallback(Handler.java:733) 
                                                           at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                           at android.os.Looper.loop(Looper.java:136) 
                                                           at android.app.ActivityThread.main(ActivityThread.java:5017) 
                                                           at java.lang.reflect.Method.invokeNative(Native Method) 
                                                           at java.lang.reflect.Method.invoke(Method.java:515) 
                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
                                                           at dalvik.system.NativeStart.main(Native Method) 
                                                        Caused by: java.lang.NullPointerException
                                                           at cct.mad.lab.SettingsActivity.onLaunchCamera(SettingsActivity.java:201)
                                                           at java.lang.reflect.Method.invokeNative(Native Method) 
                                                           at java.lang.reflect.Method.invoke(Method.java:515) 
                                                           at android.view.View$1.onClick(View.java:3818) 
                                                           at android.view.View.performClick(View.java:4438) 
                                                           at android.view.View$PerformClick.run(View.java:18422) 
                                                           at android.os.Handler.handleCallback(Handler.java:733) 
                                                           at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                           at android.os.Looper.loop(Looper.java:136) 
                                                           at android.app.ActivityThread.main(ActivityThread.java:5017) 
                                                           at java.lang.reflect.Method.invokeNative(Native Method) 
                                                           at java.lang.reflect.Method.invoke(Method.java:515) 
                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
                                                           at dalvik.system.NativeStart.main(Native Method) 

最佳答案

看起来您可能没有定义 avatarButton,如果您遵循 LogCat 上的 Caused By 路径,您会看到底部是一个 NullPointerException。

由于我看不到行号,因此问题发生在第 201 行 - 我在代码中看到的唯一明显的空指针是 avatarButton。

根据您想要做的事情,您需要采取一些不同的方式。

从 XML 中删除 android:onClick="onLaunchCamera"。

在设置内容 View 后,在 onCreate() 中添加以下内容:

View avatarButton = findViewById(R.id.ImageButton_Avatar);

avatarButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        String strAvatarPrompt = "Take your picture to store as your avatar!";
        Intent pictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(Intent.createChooser(pictureIntent, strAvatarPrompt), TAKE_AVATAR_CAMERA_REQUEST);
    }
});

avatarButton.setOnLongClickListener(new View.OnLongClickListener() {
    public boolean onLongClick(View v) {
        String strAvatarPrompt = "Choose a picture to use as your avatar!";
        Intent pickPhoto = new Intent(Intent.ACTION_PICK);
        pickPhoto.setType("image/*");
        startActivityForResult(Intent.createChooser(pickPhoto, strAvatarPrompt), TAKE_AVATAR_GALLERY_REQUEST);
        return true;
    }
});

这允许您设置具有更多控制的单击和长单击监听器。按照您的方式,在第一次单击 onClick 或 onLongClick 之前,您从未真正定义过它们。

关于java - 在 Android 应用程序上设置头像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43373287/

相关文章:

android - Environment.DIRECTORY_PICTURES 相当于 API-8 之前的版本

java - 谷歌在该点周围随机创建标记

android - 使用 opencv 使用 android 肖像模式时的问题

java - 错误 :Execution failed for task ':app:transformClassesWithMultidexlistForDebug' . 问题

java - 类之间的 Java 中的 JNI 作用域

Android:EditText 中的多行和无自动建议

android - 在应用程序最小化时打开/关闭手电筒

java - 在 spring boot 应用程序的服务层中正确使用 Optionals

java - 如何编写自定义异常?

java - android - 应用程序在保存照片时崩溃