簡體   English   中英

android studio 中的運行時權限

[英]Run time permission in android studio

我創建了一個可以發送消息和撥打電話的應用程序(僅在授予權限的情況下)

我已經嘗試通過手動允許訪問我的短信和電話的權限來發送短信或使用我的手機設置撥打電話

所以這是我的代碼(PhoneApp.java)

package com.example.phone;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class PhoneApp extends AppCompatActivity {
    private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =0 ;
    private Toolbar mTopToolbar;
    private static final int REQUEST_PHONE_CALL = 1;
    Button sendBtn;
    EditText txtMessage;
    EditText edittext1;
    Button button1;
    String phoneNo;
    String message;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myphone);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //Getting the edittext and button instance
        edittext1=(EditText)findViewById(R.id.editText);
        button1=(Button)findViewById(R.id.btnCall);
        sendBtn = (Button) findViewById(R.id.btnSendSMS);
        txtMessage = (EditText) findViewById(R.id.editText2);

        //Performing action on button click
        button1.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View view) {
                makeCall();
            }



        });

        sendBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(
                        edittext1.getText().toString(),
                        null,
                        txtMessage.getText().toString(),
                        null,
                        null);

                Toast.makeText(getApplicationContext(), "SMS sent.",
                        Toast.LENGTH_LONG).show();
            }
        });

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            Log.d("PLAYGROUND", "Permission is not granted, requesting");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
            sendBtn.setEnabled(false);
        } else {
            Log.d("PLAYGROUND", "Permission is granted");
        }
    }

    Intent intent = new Intent(Intent.ACTION_CALL);

    protected void makeCall() {
        String number=edittext1.getText().toString();
        intent.setData(Uri.parse("tel:"+number));
        if (ContextCompat.checkSelfPermission(PhoneApp.this,
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(PhoneApp.this,
                    new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
        }
        else
        {
            startActivity(intent);
        }
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
        switch (requestCode) {

            case REQUEST_PHONE_CALL: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "Calling....",
                            Toast.LENGTH_LONG).show();
                    startActivity(intent);
                }
                else
                {
                    Toast.makeText(getApplicationContext(),
                            "Unable to connect", Toast.LENGTH_LONG).show();
                    return;
                }
                return;
            }
            case MY_PERMISSIONS_REQUEST_SEND_SMS: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d("PLAYGROUND", "Permission has been granted");
                    Toast.makeText(getApplicationContext(),
                            "You can send SMS", Toast.LENGTH_LONG).show();
                    sendBtn.setEnabled(true);
                } else {
                    Log.d("PLAYGROUND", "Permission has been denied or request cancelled");
                    Toast.makeText(getApplicationContext(),
                            "Unable to connect", Toast.LENGTH_LONG).show();
                    sendBtn.setEnabled(false);
                }
            }
        }
    }

}

XML 代碼 (myphone.xml)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".PhoneApp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:titleTextColor="@android:color/white"
        android:background="?attr/colorPrimary">
    </android.support.v7.widget.Toolbar>



    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:hint="@string/phone_number"
        android:layout_alignParentRight="true"
        android:layout_marginTop="88dp"
        android:layout_marginRight="109dp"
        android:ems="10" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_alignLeft="@+id/editText"
        android:layout_marginLeft="6dp"
        android:layout_marginTop="65dp"
        android:hint="@string/type_your_message"
        android:ems="10"
        android:inputType="textMultiLine" />
    <Button
        android:id="@+id/btnSendSMS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="90dp"
        android:layout_below="@+id/editText2"
        android:layout_marginTop="60dp"
        android:text="Send Sms" />

    <Button
        android:id="@+id/btnCall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="302dp"
        android:layout_marginLeft="270dp"
        android:text="Call" />

</RelativeLayout>

這是我的設計:

在此處輸入圖片說明

我希望我的應用程序只有在我點擊“發送短信”按鈕時才請求許可,而不是每次我進入上述頁面時我的應用程序都會請求許可(不點擊“發送短信”按鈕)。 但這不是按鈕的情況。 它工作得很好(只有在我點擊“呼叫”按鈕后才請求許可)。

如果您通過以代碼段的形式提供解決方案來幫助我解決這個問題,那就太好了。 對不起,我的英語不好。 提前致謝!

解決方案很簡單,只需將您的 onCreate() 更改為:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myphone);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    //Getting the edittext and button instance
    edittext1 = (EditText) findViewById(R.id.editText);
    button1 = (Button) findViewById(R.id.btnCall);
    sendBtn = (Button) findViewById(R.id.btnSendSMS);
    txtMessage = (EditText) findViewById(R.id.editText2);

    //Performing action on button click
    button1.setOnClickListener(this::makeCall());

    sendBtn.setOnClickListener((view) - >{
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            Log.d("PLAYGROUND", "Permission is not granted, requesting");
            ActivityCompat.requestPermissions(this, new String[] {
                Manifest.permission.SEND_SMS
            },
            MY_PERMISSIONS_REQUEST_SEND_SMS);
        } else {
            Log.d("PLAYGROUND", "Permission is granted");
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(
            edittext1.getText().toString(), null, txtMessage.getText().toString(), null, null);

            Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
        }
    });
}

問題是您正在請求在 onCreate() 函數中發送消息的權限,但要使其按需要工作,您必須向按鈕的 onClick() 偵聽器請求權限。

就在這個主題上,我通過更改為 lambda 函數來格式化您的代碼。

希望這能解決您的問題。 如果您願意,我很樂意解釋我更改的代碼的任何部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM