【问题标题】:Why is onActivityResult not getting called?为什么 onActivityResult 没有被调用?
【发布时间】:2020-05-26 22:03:34
【问题描述】:

我已经检查了here 提到的解决方案,但我的应用程序没有大部分设置,包括清单设置。我可以尝试改变的那些,我做到了。还是没有运气。

以下是我的代码,这是我在 TabHost 中的一个选项卡的一部分。我可以从图库中选择图像,但之后的任何语句都不会执行。不打印任何 sysout 语句。

我所有的变量,除了按钮,都是静态的。会不会有问题?

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message);

        int permission = ActivityCompat.checkSelfPermission(messageActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    messageActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    101
            );
        }
        databaseRef = FirebaseDatabase.getInstance().getReference();
        imgStorageRef = FirebaseStorage.getInstance().getReference();
        imgRef = databaseRef.child("images");
        user = MainActivity.sendUser();
        et = findViewById(R.id.msg);
        et.setText("");
        send = findViewById(R.id.sendBtn);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                startActivityForResult(gallery, PICK_IMAGE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        System.out.println("Entered onActivityResult");
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == PICK_IMAGE){
            imageUri = data.getData();
            try {
                bmp = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
                bmp=bmp.copy(Bitmap.Config.ARGB_8888 , true);
                encode();
                System.out.println("Encoded");
                upload();
                System.out.println("Uploaded");
                /*Code continues...*/

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

这是清单文件:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".messageActivity"/>
        <activity android:name=".chatActivity" />
        <activity android:name=".usersActivity" />
        <activity android:name=".afterRegister" />
        <activity android:name=".activityTwo" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

令人惊讶的是,这个完全相同的代码在所有应用程序中都适用于我。但它们中的大多数只有 2 次活动。在这里,我已将其包含在 TabHost 的活动中,但根据我的互联网搜索,这应该不是问题。

【问题讨论】:

    标签: android firebase onactivityresult


    【解决方案1】:

    您是否在 Manifest 文件中添加了必要的权限?

    【讨论】:

    • 您可以访问图库吗?也许问题从那里开始......
    • 我可以访问图库了。
    【解决方案2】:

    测试这段代码:

    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(intent, PICK_IMAGE);
    

    特别是这个:

    MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    

    【讨论】:

    • 感谢您的建议,但遗憾的是,即使这样也行不通。
    【解决方案3】:

    试试这个来挑选:

    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent, PICK_IMAGE);
    

    出于测试目的:

    如果您使用的是 android 6 或更高版本,请转到设备上的应用程序管理器,然后转到权限并检查它们是否已启用 readwrite

    现实:

    如果您使用的是 android 6 或更高版本,则必须添加运行时权限而不是手动操作。

    更多详情here

    【讨论】:

    • 是的,我已将这些行包含在清单中。我已经包含了清单代码。我还在代码中检查这些权限,如图所示。
    • 正如我所说,如果您运行的是 android 6 或更高版本,请转到设备应用管理器并在您的应用中启用权限以进行测试。
    • 感谢您的建议,遗憾的是即使这样也行不通。刚刚试了一下。
    • 你能告诉我你运行的是android 6或更高版本的设备吗?
    • 我的模拟器运行的是android 7.0
    猜你喜欢
    • 2019-03-31
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多