如何在现有应用程序上实现Android 6.0运行时权限

如何在现有应用程序上实现Android 6.0运行时权限,第1张

概述问题: 我有一个现有的应用程序,我想实现Android 6.0的运行权限.我在运行时权限上已经阅读了很多不同的东西,但我似乎无法绕过所有不同的片段.我找到的任何内容实际上都没有显示如何将其实现到现有的Activity中. 其他要点 当我运行针对SDK v23的现有应用程序时,我得到了预期的权限错误,但我得到的权限错误甚至不是我请求的权限.我在Manifest文件中有SEND_SMS权限,但我得到 问题:

我有一个现有的应用程序,我想实现Android 6.0的运行时权限.我在运行时权限上已经阅读了很多不同的东西,但我似乎无法绕过所有不同的片段.我找到的任何内容实际上都没有显示如何将其实现到现有的Activity中.

其他要点

当我运行针对SDK v23的现有应用程序时,我得到了预期的权限错误,但我得到的权限错误甚至不是我请求的权限.我在Manifest文件中有SEND_SMS权限,但我得到的错误是READ_SMS.我的应用程序在6.0之前运行正常,没有READ_SMS.

我希望我的应用程序在应用程序启动后立即请求许可,因为应用程序的唯一目的是发送短信,因此没有该权限,该应用程序没有其他用途.

问题:

一旦应用程序启动,我如何将SEND_SMS的运行时权限实现到我现有的Activity中?

这些权限的处理是否需要在后台线程中运行?

我是否还需要READ_SMS的权限,因为这是它给出的权限错误(即使该权限从未在我的应用程序上使用过)?

我现有的活动:

public class MainActivity extends Activity implements OnClickListener {SimpleCursorAdapter mAdapter;autoCompleteTextVIEw txtContract;EditText txtTrip;EditText txtDate;button btnSend;button btnUpdate;String today;String SENT = "SMS_SENT";String DEliVERED = "SMS_DEliVERED";private static final String API_KEY = "abcxyz";private static final String CONTRACT_REGEX = "^([a-zA-Z0-9_-]){5}$";private static final String TRIP_REGEX = "^([a-zA-Z0-9_-]){1,10}$";private static final String DATE_REGEX = "^\d{2}\/\d{2}\/\d{4}$";private static final String PHONE_NUMBER = "1234567890";private static final String DATE_FORMAT = "MM/dd/yyyy";private broadcastReceiver sendbroadcastReceiver;private broadcastReceiver deliverybroadcastReceiver;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_main);    // Todo - IMPLEMENT RUNTIME PERMISSIONS FOR ANDROID >= 6.0    try {        // Initialize VIEws        txtContract = (autoCompleteTextVIEw) findVIEwByID(R.ID.txtContract);        txtTrip = (EditText) findVIEwByID(R.ID.txtTrip);        txtDate = (EditText) findVIEwByID(R.ID.txtDate);        btnSend = (button) findVIEwByID(R.ID.btnSend);        btnUpdate = (button) findVIEwByID(R.ID.btnUpdate);        // Set Listeners        txtDate.setonClickListener(this);        btnSend.setonClickListener(this);        btnUpdate.setonClickListener(this);        // Set Date To Today And Format        final Calendar td = Calendar.getInstance();        int tYear = td.get(Calendar.YEAR);        int tMonth = td.get(Calendar.MONTH);        int tDay = td.get(Calendar.DAY_OF_MONTH);        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT,Locale.ENGliSH);        td.set(tYear,tMonth,tDay);        today = sdf.format(td.getTime());        txtDate.setText(today);        // Check If Device Is Capable Of Sending SMS        PackageManager pm = this.getPackageManager();        if (!pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY) &&                !pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {            Toast.makeText(this,"Sorry,your device probably can't send SMS...",Toast.LENGTH_SHORT).show();        }        // Send Receiver        sendbroadcastReceiver = new broadcastReceiver() {            public voID onReceive(Context arg0,Intent arg1) {                switch (getResultCode()) {                    case Activity.RESulT_OK:                        Toast.makeText(getBaseContext(),"Requesting trip...",Toast.LENGTH_SHORT).show();                        break;                    case SmsManager.RESulT_ERROR_GENERIC_FAILURE:                        Toast.makeText(getBaseContext(),"Generic failure",Toast.LENGTH_SHORT).show();                        break;                    case SmsManager.RESulT_ERROR_NO_SERVICE:                        Toast.makeText(getBaseContext(),"No service",Toast.LENGTH_SHORT).show();                        break;                    case SmsManager.RESulT_ERROR_NulL_PDU:                        Toast.makeText(getBaseContext(),"Null PDU",Toast.LENGTH_SHORT).show();                        break;                    case SmsManager.RESulT_ERROR_RAdio_OFF:                        Toast.makeText(getBaseContext(),"Radio off",Toast.LENGTH_SHORT).show();                        break;                }            }        };        // Delivery Receiver        deliverybroadcastReceiver = new broadcastReceiver() {            public voID onReceive(Context arg0,"Trip request successful.",Toast.LENGTH_SHORT).show();                        break;                    case Activity.RESulT_CANCELED:                        Toast.makeText(getBaseContext(),"Trip request Failed.",Toast.LENGTH_SHORT).show();                        break;                }            }        };        // Register Receivers        registerReceiver(deliverybroadcastReceiver,new IntentFilter(DEliVERED));        registerReceiver(sendbroadcastReceiver,new IntentFilter(SENT));        // Set Up Adapter For autocomplete        initializeautoCompleteAdapter();    }    catch (Exception ex) {        Toast.makeText(this,"Error in MainActivity.onCreate: " + ex.getMessage(),Toast.LENGTH_SHORT).show();    }}@OverrIDeprotected voID onDestroy() {    unregisterReceiver(sendbroadcastReceiver);    unregisterReceiver(deliverybroadcastReceiver);    super.onDestroy();}// auto Complete Adapterpublic voID initializeautoCompleteAdapter() {    // Set Database Handler    final DBHelper DBHelper = new DBHelper(getBaseContext());    // Set Up Adapter For autocomplete (This does not run on the main UI thread)    mAdapter = new SimpleCursorAdapter(this,androID.R.layout.simple_List_item_1,null,new String[] { "contract" },new int[] {androID.R.ID.text1},0);    txtContract.setAdapter(mAdapter);    mAdapter.setCursorToStringConverter(new SimpleCursorAdapter.CursorToStringConverter() {        @OverrIDe        public CharSequence convertToString(Cursor cursor) {            final int colindex = cursor.getColumnIndexOrThrow("contract");            return cursor.getString(colindex);        }    });    mAdapter.setFilterqueryProvIDer(new FilterqueryProvIDer() {        @OverrIDe        public Cursor runquery(CharSequence description) {            String strContract = txtContract.getText().toString();            return DBHelper.getContract(strContract);        }    });}// OnClickListener Handler@OverrIDepublic voID onClick(VIEw v) {    // Handle Clicked VIEw    switch (v.getID()) {        // Date FIEld        case R.ID.txtDate:            // Get Current Date            final Calendar c = Calendar.getInstance();            c.set(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH),0);            int mYear = c.get(Calendar.YEAR);            int mMonth = c.get(Calendar.MONTH);            int mDay = c.get(Calendar.DAY_OF_MONTH);            // Set Up DatePicker Dialog            DatePickerDialog datePickerDialog = new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener() {                        @OverrIDe                        public voID onDateSet(DatePicker vIEw,int year,int month,int day) {                            // define A New Calendar For Formatting                            final Calendar cf = Calendar.getInstance();                            // Format Selected Date                            SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT,Locale.ENGliSH);                            cf.set(year,month,day);                            String selectedDate = sdf.format(cf.getTime());                            // Add Selected Date To EditText FIEld                            txtDate.setText(selectedDate);                        }                    },mYear,mMonth,mDay);            // Set Max Date            c.add(Calendar.DATE,2);            c.add(Calendar.SECOND,-1);            datePickerDialog.getDatePicker().setMaxDate(c.getTimeInMillis());            // Set Min Date            c.add(Calendar.DAY_OF_MONTH,-5);            c.add(Calendar.SECOND,1);            datePickerDialog.getDatePicker().setMinDate(c.getTimeInMillis());            // display DatePicker            datePickerDialog.show();        break;        // submit button        case R.ID.btnSend:            Boolean rval = true;            if (!ValIDation.isValID(txtContract,CONTRACT_REGEX,"InvalID Contract #",true)) rval = false;            if (!ValIDation.isValID(txtTrip,TRIP_REGEX,"InvalID Trip #",true)) rval = false;            if (!ValIDation.isValID(txtDate,DATE_REGEX,"InvalID Date",true)) rval = false;            if(rval) {                new ValIDateAndSend(this).execute();            }        break;        // Update Contract DB        case R.ID.btnUpdate:            TelephonyManager tMgr = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);            String mPhoneNumber = tMgr.getline1Number();            new POSTAsync(this).execute(API_KEY,mPhoneNumber);        break;    }}// ValIDate And Sendclass ValIDateAndSend extends AsyncTask<String,String,Boolean>{    private final WeakReference<MainActivity> MainActivityWeakRef;    public ValIDateAndSend(MainActivity mainActivity) {        super();        this.MainActivityWeakRef = new WeakReference<>(mainActivity);    }    // define Variables    String strContract = txtContract.getText().toString();    String strTrip = txtTrip.getText().toString();    String strDate = txtDate.getText().toString();    String strMessage = strContract.concat("|").concat(strTrip).concat("|").concat(strDate);    Boolean rval = true;    @OverrIDe    protected voID onPreExecute() {    }    @OverrIDe    protected Boolean doInBackground(String... contract) {        DBHelper DBHelper = new DBHelper(MainActivity.this);        if (DBHelper.valIDateContract(strContract) < 1) rval = false;        return rval;    }    @OverrIDe    protected voID onPostExecute(Boolean rval){        if(rval){            // HIDe Keyboard            VIEw vIEw = MainActivity.this.getCurrentFocus();            if(vIEw != null){                inputMethodManager imm = (inputMethodManager) getSystemService(Context.input_METHOD_SERVICE);                imm.hIDeSoftinputFromWindow(vIEw.getwindowToken(),0);            }            if (MainActivityWeakRef.get() != null && !MainActivityWeakRef.get().isFinishing()) {                // Confirm Details                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);                alert.setTitle("Confirm Trip");                alert.setMessage("CONTRACT: " + strContract + "\nTRIP: " + strTrip + "\nDATE: " + strDate);                alert.setPositivebutton("Ok",new DialogInterface.OnClickListener() {                    public voID onClick(DialogInterface dialog,int whichbutton) {                        // Send SMS                        sendSMS(PHONE_NUMBER,strMessage);                        // Clear FIElds                        txtContract.setText("");                        txtTrip.setText("");                        txtDate.setText(today);                    }                });                alert.setNegativebutton("Cancel",int whichbutton) {                    // Cancelled                    }                });                // Show Alert                alert.show();            }        }        else{            txtContract.setError("InvalID contract #");            Toast.makeText(MainActivity.this,"You may need to update contracts.",Toast.LENGTH_LONG).show();        }    }}// Send SMSprivate voID sendSMS(String phoneNumber,String message) {    String SENT = "SMS_SENT";    String DEliVERED = "SMS_DEliVERED";    PendingIntent sentPI = PendingIntent.getbroadcast(this,new Intent(SENT),0);    PendingIntent deliveredPI = PendingIntent.getbroadcast(this,new Intent(DEliVERED),0);    SmsManager sms = SmsManager.getDefault();    sms.sendTextMessage(phoneNumber,message,sentPI,deliveredPI);}

}

解决方法 AndroID 6.0的运行时权限模型主要分为部分

1.检查许可

2.申请许可

您可以在活动中为此项创建两种方法,如下所示

检查权限

private boolean checkPermission(){    int result = ContextCompat.checkSelfPermission(context,Manifest.permission.READ_SMS);    if (result == PackageManager.PERMISSION_GRANTED){        return true;    } else {        return false;    }}

请求许可

private voID requestPermission(){    if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.READ_SMS)){        Toast.makeText(context,"Read Sms Allowed.",Toast.LENGTH_LONG).show();    } else {        ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_SMS},PERMISSION_REQUEST_CODE);    }}

最后但并非最不重要的是,您需要覆盖onRequestPermissionsResult方法

@OverrIDepublic voID onRequestPermissionsResult(int requestCode,String permissions[],int[] grantResults) {    switch (requestCode) {        case PERMISSION_REQUEST_CODE:            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                Snackbar.make(vIEw,"Permission Granted,Now you can access SMS.",Snackbar.LENGTH_LONG).show();            } else {                Snackbar.make(vIEw,"Permission DenIEd,You cannot access SMS.",Snackbar.LENGTH_LONG).show();            }            break;    }}

正如你所问我需要在线程中运行它.答案是否只是在主线程中执行此 *** 作

总结

以上是内存溢出为你收集整理的如何在现有应用程序上实现Android 6.0运行时权限全部内容,希望文章能够帮你解决如何在现有应用程序上实现Android 6.0运行时权限所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1130552.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存