【问题标题】:How to solve the error"call requires permission which may be rejected by user"?如何解决“呼叫需要权限可能被用户拒绝”的错误?
【发布时间】:2017-12-22 15:13:30
【问题描述】:

目前,我正在尝试构建一个 QR 码扫描仪,它可以扫描 QR 码并同时获取单元格的设备 ID,然后最终将其发布到服务器

我经常收到错误“呼叫需要权限,可能会被用户拒绝”

在 manifest.xml 中,我已经包含了<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 我还尝试将 android SDK 23 降级回 22。

另外,这里的答案似乎都不能解决我的问题。有什么想法吗?

public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
private static final int BARCODE_READER_REQUEST_CODE = 1;
public TelephonyManager tel;
public TextView imei;

private TextView mResultTextView;


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

    mResultTextView = (TextView) findViewById(R.id.result_textview);
    Button scanBarcodeButton = (Button) 
    findViewById(R.id.scan_barcode_button);
    scanBarcodeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getApplicationContext(), 
     BarcodeCaptureActivity.class);
            startActivityForResult(intent, BARCODE_READER_REQUEST_CODE);
        }
    });

}

private class OkHttpAync extends AsyncTask<Object, Void, Object> {

    private String TAG = MainActivity.OkHttpAync.class.getSimpleName();
    private Context contx;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Object doInBackground(Object... params) {
        contx = (Context) params[0];
        String requestType = (String) params[1];
        String requestParam = (String) params[2];

        Log.e(TAG, "processing http request in async task");

        if ("post".equals(requestType)) {
            Log.e(TAG, "processing post http request using OkHttp");
            postHttpResponse(requestParam);
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        super.onPostExecute(result);
    /*
        if (result != null) {
            Log.e(TAG, "populate UI after response from service using OkHttp 
   client");
            respone.setText((String) result);
        }

       */
    }
}
public void postHttpResponse(String requestParam) {
    OkHttpClient httpClient = new OkHttpClient();
    String url = "https://requestb.in/1k1hm5y1";
    RequestBody formBody = new FormBody.Builder()
           // .add("employeeid",userData )
            //.add("imie",userData2)
            .add("qrcode",requestParam)
            .build();
    Request request = new Request.Builder()
            .url(url)
            .post(formBody)
            .build();
    Response response = null;
    try{
        response = httpClient.newCall(request).execute();
    }
    catch (IOException e) {

    }
}


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

// GET DEVICE ID
    TelephonyManager tManager = (TelephonyManager) getBaseContext()
            .getSystemService(Context.TELEPHONY_SERVICE);
    String deviceIMEI = tManager.getDeviceId();


    if (requestCode == BARCODE_READER_REQUEST_CODE) {
        if (resultCode == CommonStatusCodes.SUCCESS) {
            if (data != null) {
                Barcode barcode = 
     data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject);
                Point[] p = barcode.cornerPoints;
                //display scan bar code value
                mResultTextView.setText(barcode.displayValue);

                new MainActivity.OkHttpAync().execute(this, 
      "post",barcode.displayValue + 33 );

            } else mResultTextView.setText(R.string.no_barcode_captured);

        } else Log.e(LOG_TAG, 
   String.format(getString(R.string.barcode_error_format),
                CommonStatusCodes.getStatusCodeString(resultCode)));
    } else super.onActivityResult(requestCode, resultCode, data);
    }
     }

【问题讨论】:

标签: java android


【解决方案1】:

READ_PHONE_STATE 权限是dangerous,您需要在运行时请求它。你应该看看这个Google Guide

我建议使用这个PermissionsDispatcher Library 以便于请求权限:

@NeedsPermission(Manifest.permission.READ_PHONE_STATE)
void readPhoneState() {
    // do any thing here
}


@OnPermissionDenied(Manifest.permission.READ_PHONE_STATE)
    void showDeniedForPhoneState() {

    }

【讨论】:

    【解决方案2】:

    几乎在这里尝试了所有答案,并且通过将 sdk 版本更改为 22 来实现。 希望它对遇到这个问题的人也有帮助

    在 AndroidManifest.xml 中

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 22
        buildToolsVersion '22.0.2'
    
        defaultConfig {
            applicationId "com.varvet.barcodereadersample"
            minSdkVersion 19
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:22.1.0'
        compile 'com.google.android.gms:play-services-vision:11.6.0'
        compile 'com.squareup.okhttp3:okhttp:3.3.1'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多