Android 未调用onActivityResult(),但可在其他地方使用

Android 未调用onActivityResult(),但可在其他地方使用,android,android-intent,android-activity,Android,Android Intent,Android Activity,我有一个活动调用另一个正在等待结果的活动(startActivityForResult())。第二个活动只是对用户的一种解释,与用户的操作无关,我想打开一个本机屏幕,让用户允许缺少的权限。我可以正常打开第二个活动,但是从不调用onActivityResult() 在同一个项目中,还有另外一对活动做同样的事情,它们工作得很好。这两个在代码方面是相等的,但它们无论如何都不起作用 第一项活动 public class RingtonesActivity extends Activity {

我有一个活动调用另一个正在等待结果的活动(
startActivityForResult()
)。第二个活动只是对用户的一种解释,与用户的操作无关,我想打开一个本机屏幕,让用户允许缺少的权限。我可以正常打开第二个活动,但是从不调用
onActivityResult()

在同一个项目中,还有另外一对活动做同样的事情,它们工作得很好。这两个在代码方面是相等的,但它们无论如何都不起作用

第一项活动

public class RingtonesActivity extends Activity {


    private boolean falta2Per = false;
    private boolean faltaSoPerEsc = false;
    private boolean faltaSoPerConf = false;

    private static final int REQUEST_CODE_PERMISSION_RING = 0x0009;
    private static final int REQUEST_CODE_WRITE_PERMISSION = 0x001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                …
    }


    private View.OnClickListener onClickToque() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new MudarToquesTask().execute();
                finish();
            }
        };
    }



    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == REQUEST_CODE_PERMISSION_RING) {
            if (ContextCompat.checkSelfPermission(RingtonesActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(RingtonesActivity.this, Manifest.permission.WRITE_SETTINGS)
                            != PackageManager.PERMISSION_GRANTED) {

                LogUtil.i("RINGTONES - Pedindo as 2 permissões.");
                falta2Per = true;
                //ped as 2 perm
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.WRITE_SETTINGS},
                        REQUEST_CODE_WRITE_PERMISSION);
            } else {
                if (ContextCompat.checkSelfPermission(RingtonesActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    faltaSoPerEsc = true;
                    LogUtil.i("RINGTONES - Pedindo permissão de esc.");
                    //ped a perm de esc em area ext
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            REQUEST_CODE_WRITE_PERMISSION);
                }

                if (ContextCompat.checkSelfPermission(RingtonesActivity.this, Manifest.permission.WRITE_SETTINGS)
                        != PackageManager.PERMISSION_GRANTED) {
                    faltaSoPerConf = true;
                    LogUtil.i("RINGTONES - Pedindo permissão p/ alt as conf");
                    //ped a perm p/ alt as conf
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.WRITE_SETTINGS},
                            REQUEST_CODE_WRITE_PERMISSION);
                }
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_WRITE_PERMISSION:
                if (grantResults.length > 0) {
                    if (falta2Per) {
                        if (grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                                grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                            LogUtil.i("RINGTONES - Ambas as per concedidas.");
                            showDefaultToast(R.drawable.blink_emot, getString(R.string.agora_funciona));
                        } else {
                            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                                LogUtil.i("RINGTONES - Per de esc negada.");
                                showDefaultToast(R.drawable.lagrima_emot, "Desculpe, mas você negou a permissão de escrita.\nO app não podera realizar essa tarefa.");
                            }

                            if (grantResults[1] != PackageManager.PERMISSION_GRANTED) {
                                LogUtil.i("RINGTONES - Per p/ alt conf negada.");
                                showDefaultToast(R.drawable.lagrima_emot, "Desculpe, mas você negou a permissão para alterar as configurações.\nO app não podera realizar essa tarefa.");
                            }
                        }

                        falta2Per = false;
                    }

                    if (faltaSoPerEsc) {
                        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            LogUtil.i("RINGTONES - Perm de esc concedida.");
                            showDefaultToast(R.drawable.blink_emot, getString(R.string.agora_funciona));
                        } else {
                            LogUtil.i("RINGTONES - Per de esc negada.");
                            showDefaultToast(R.drawable.lagrima_emot, "Desculpe, mas você negou a permissão de escrita.\nO app não podera realizar essa tarefa.");
                        }

                        faltaSoPerEsc = false;
                    }

                    if (faltaSoPerConf) {
                        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            LogUtil.i("RINGTONES - Perm p/ alt as conf concedida.");
                            showDefaultToast(R.drawable.blink_emot, getString(R.string.agora_funciona));
                        } else {
                            LogUtil.i("RINGTONES - Per p/ alt as conf negada.");
                            showDefaultToast(R.drawable.lagrima_emot, "Desculpe, mas você negou a permissão para alterar as configurações.\nO app não podera realizar essa tarefa.");
                        }

                        faltaSoPerConf = false;
                    }

                } else {
                    LogUtil.i("RINGTONES - Ambas as per negadas");
                    showDefaultToast(R.drawable.lagrima_emot, "Desculpe, mas você negou a(s) permissões. O app não podera realizar essa tarefa.");
                }
                break;
        }
    }

    /**
     * Task p/ altera o toque ou o som do sms numa thread aparte
     */
    private class MudarToquesTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
                if (ContextCompat.checkSelfPermission(RingtonesActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
                        PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(RingtonesActivity.this, Manifest.permission.WRITE_SETTINGS)
                        == PackageManager.PERMISSION_GRANTED) {

                   ...

                } else {
                    LogUtil.i("RINGTONES - Falta ao menos uma das 2 permissões. Exibindo tela de explicações.");
                    hasPermission = false;
                    startActivityForResult(new Intent(getApplicationContext(), PermissionExplainRingtonesActivity.class),
                            REQUEST_CODE_PERMISSION_RING);
                }


            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            ...

            }
        }

    }
}
public class PermissionExplainRingtonesActivity extends Activity {

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

private void inits() {
    Button btnEntendi = (Button) findViewById(R.id.btn_entendi);
    btnEntendi.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setResult(RESULT_OK);
            finish();
        }
    });
}

@Override
public void onBackPressed() {
    setResult(RESULT_OK);
    super.onBackPressed();
}

}您的
AsyncTask
正在后台调用
startActivityForResult
。尝试更改代码并在UI线程中调用它,可能是在
AsyncTask

onPostExecute
中,问题是您正在从另一个线程调用
startActivityForResult
,这就是它中断的原因,就像其他人提到的那样。但是你甚至不需要使用
AsyncTask
,因为你所要做的就是检查权限,如果应用程序已经没有权限,就启动一个活动


这不是一个长任务或UI阻塞任务,因此可以在主线程本身上完成。

如果您正在执行一些繁重的操作,并且不想阻塞主UI线程,则应使用AsyncTask。在您的情况下,为了检查授予的权限,您不需要在后台线程上执行此操作,可以在主线程上执行

未调用onActivityResult()
的原因,因为startActivityForResult是从其他线程(后台线程)调用的


为什么从
doInBackground
调用
startActivityForResult
?我记得,活动操作应该发生在主线程中,所以对于主线程,应该从
onPostExecute
Really thx调用它,你们都是对的。这很奇怪,因为我尝试过在其他线程中调用startActivityForResult()几次(在此应用程序中使用它之前),并且工作正常。。。另一对活动也使用了其他线程,并且有效。但是这个没有。无论如何,我将项目的所有活动都更改为仅在UI线程中调用。现在它们都能工作了。谢谢。