应用程序在棉花糖上无法正常工作

时间:2016-12-02 07:18:43

标签: android runtime-permissions

我正在创建一个应用程序,用户只需单击按钮即可通过短信发送其位置。我在Android 5.1上运行的手机上测试了这个,它运行正常,但是当我尝试在marshmellow上运行它但它没有发送消息。我想这是因为运行时权限这里是代码。告诉我应该在哪里通过运行时权限

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.provider.Settings;
import android.content.Intent;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
public Button button;

private LocationManager locationManager;
private LocationListener listener;
private String gpslonla;


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






    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View view) {
            getlocation();


        }







    });

}


private void getlocation() {

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    listener = new LocationListener() {



        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {
            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(i);

        }
        @Override
        public void onLocationChanged(Location location) {
            gpslonla=location.getLatitude()+ "," + location.getLongitude();
            sendlocationsms();
        }

    };
    configure_button();
}

private void sendlocationsms() {
    String phoneNumber = "903399000";
    //Location location = new Location("dummyprovider");

    SmsManager smsManager = SmsManager.getDefault();
    StringBuffer smsBody = new StringBuffer();
    smsBody.append("http://maps.google.com?q="+gpslonla);

    //smsBody.append(location.getLatitude());
    //smsBody.append(",");
    //smsBody.append(location.getLongitude());
    smsManager.sendTextMessage(phoneNumber, null, smsBody.toString(), null, null);

    Toast toast = Toast.makeText(getApplicationContext(), "Your message has been sent", Toast.LENGTH_LONG);
    toast.setGravity(Gravity.CENTER, 0, 0);
    toast.show();


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 10:
            configure_button();
            break;
        default:
            break;
    }
}

void configure_button() {

我在这里尝试检查短信权限并在下面请求。但那并没有发送短信。请提供适当的解决方案。感谢。

    // first check for permissions
    if (ActivityCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET}
                    , 10);
        }
        return;
    }
    // this code won't execute IF permissions are not allowed, because in the line above there is return statement.

            locationManager.requestLocationUpdates("gps", 5000,5000, listener);

}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu1:

            Toast.makeText(this, "Option1", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.menu2:
            finish();

            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}
}

2 个答案:

答案 0 :(得分:0)

如果权限是一个问题,请仔细检查:

manifest.xml中的

  <uses-permission android:name="android.permission.SEND_SMS" />

    if (ActivityCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED&&Manifest.permission.SEND_SMS!=PackageManager.PERMISSION_GRANTED) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET,Manifest.permission.SEND_SMS}
                , 10);
    }
    return;
}
// this code won't execute IF permissions are not allowed, because in the line above there is return statement.

        locationManager.requestLocationUpdates("gps", 5000,5000, listener);

}

上面的权限也必须在Manifest.xml中定义。

答案 1 :(得分:0)

试试这个, 首先检查所有权限是否被授予?

通过检查

String[] allPermissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET,  Manifest.permission.SEND_SMS};
onCreate()中的

    检查

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   if(!hasPermissions(this, allPermissions)){
       requestPermissions(allPermissions, 10);
 }
}



public boolean hasPermissions(Context context, String[] permissions) {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }