简体   繁体   中英

Why setting Date and Time Using DatePicker and TimePicker Android application crashes?

I wanna to set my time and date using Datepicker and Timepicker, but app crashes when I press my button. here is codes:

public class MainActivity extends Activity {
    DatePicker datePicker;
    TimePicker timePicker;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        timePicker = (TimePicker) findViewById(R.id.timePicker);
        timePicker.setIs24HourView(true);
        datePicker = (DatePicker) findViewById(R.id.datePicker);
    }

    public void btnClick(View view) {
        Toast.makeText(getBaseContext(),
                "Date selected:" + (datePicker.getMonth() + 1) + 
                "/" + datePicker.getDayOfMonth() +
                "/" + datePicker.getYear(), 
                Toast.LENGTH_SHORT).show();

        NumberFormat formatter = new DecimalFormat("00");
        Toast.makeText(getBaseContext(),
                "Time selected:" +
                        timePicker.getCurrentHour() +
                        ":" + formatter.format(timePicker.getCurrentMinute()),
                Toast.LENGTH_SHORT).show();

        Calendar c = Calendar.getInstance();
        c.set(datePicker.getYear(),Calendar.SEPTEMBER,datePicker.getDayOfMonth(), timePicker.getCurrentHour(),timePicker.getCurrentMinute(), 00);
        AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        am.setTime(c.getTimeInMillis());
    }    
}

and this is in manifast:

<permission android:name="android.permission.SET_TIME"/>

Other question is How to set month in my codes? set() method won't accept datePicker.getMonth() .

logs:

java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:3044)
            at android.view.View.performClick(View.java:3511)
            at android.view.View$PerformClick.run(View.java:14109)
            at android.os.Handler.handleCallback(Handler.java:605)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at android.view.View$1.onClick(View.java:3039)
            at android.view.View.performClick(View.java:3511)
            at android.view.View$PerformClick.run(View.java:14109)
            at android.os.Handler.handleCallback(Handler.java:605)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.SecurityException: setTime: Neither user 10050 nor current process has android.permission.SET_TIME.
            at android.os.Parcel.readException(Parcel.java:1327)
            at android.os.Parcel.readException(Parcel.java:1281)
            at android.app.IAlarmManager$Stub$Proxy.setTime(IAlarmManager.java:237)
            at android.app.AlarmManager.setTime(AlarmManager.java:290)
            at net.learn2develop.usingdatepicker.MainActivity.btnClick(MainActivity.java:45)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at android.view.View$1.onClick(View.java:3039)
            at android.view.View.performClick(View.java:3511)
            at android.view.View$PerformClick.run(View.java:14109)
            at android.os.Handler.handleCallback(Handler.java:605)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)

Your device should be rooted .

Please add permission in androidmanifest.xml

<permission android:name="android.permission.SET_TIME"
    android:protectionLevel="signature|system"
    android:label="@string/permlab_setTime"
    android:description="@string/permdesc_setTime" />

try this now.

Calling setTime() on AlarmManager requires the SET_TIME permission and you cannot get it as a 3rd party app developer. It's a system permission and your app would need to be a system app signed with a platform signing key to get it. Or you need to be root.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM