Avinash Kumar
Avinash Kumar

Reputation: 318

getApplicationContext() method getting error

I am a Android beginner, making a simple Service example.

but in a single code getApplicationContext() method behaves differently, Please check comment of MainActivity.

MainActivity.java

package com.avisingh.servicetest;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

    final Button alertButton = (Button)findViewById(R.id.alert_btn);

    alertButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //If i placing here getApplicationContext() method then getting error;
            builder.setTitle("Warning");
            builder.setMessage("Are you sure to open media played in this app?");

            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    startActivity(new Intent(getApplicationContext(),PlayerActivity.class)); // here getApplicationContext() and MainActivity.this both working
                }
            });

            builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

            AlertDialog alertDialog = builder.create();
            alertDialog.show(); //getting error here.
        }
    });
 }
}

PlayerActivity.java

package com.avisingh.servicetest;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;


public class PlayerActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.player_activity);

    final Button startBtn = (Button)findViewById(R.id.start_btn);
    final Button stopBtn = (Button)findViewById(R.id.stop_btn);

    startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startService(new Intent(getApplicationContext(),MyServices.class));
        }
    });

    stopBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopService(new Intent(getApplicationContext(),MyServices.class));
        }
    });
 }
}

MyServices.java

package com.avisingh.servicetest;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.support.annotation.Nullable;


public class MyServices extends Service {
MediaPlayer mediaPlayer;
@Nullable
@Override
public IBinder onBind(Intent intent) {
    //return null;
    throw  new UnsupportedOperationException("Not implemented");
}

@Override
public void onCreate() {
    super.onCreate();
    mediaPlayer = MediaPlayer.create(getApplicationContext(),R.raw.one_man);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mediaPlayer.start();
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    super.onDestroy();
    mediaPlayer.stop();
 }
}

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.avisingh.servicetest">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".PlayerActivity"/>
    <service android:name=".MyServices"/>
</application>

activity_main

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.avisingh.servicetest.MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/alert_btn"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:id="@+id/alert_btn"/>

</RelativeLayout>

player_activity

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="@string/start_btn"
    android:id="@+id/start_btn"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="50dp"
    android:text="@string/stop_btn"
    android:id="@+id/stop_btn"/>

</RelativeLayout>

Error:

08-14 14:17:58.916 6874-6874/com.avisingh.servicetest E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.avisingh.servicetest, PID: 6874
                                                                    java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
                                                                        at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:359)
                                                                        at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:328)
                                                                        at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:289)
                                                                        at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:83)
                                                                        at android.support.v7.app.AlertController.installContent(AlertController.java:225)
                                                                        at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:257)
                                                                        at android.app.Dialog.dispatchOnCreate(Dialog.java:373)
                                                                        at android.app.Dialog.show(Dialog.java:274)
                                                                        at com.avisingh.servicetest.MainActivity$1.onClick(MainActivity.java:42)
                                                                        at android.view.View.performClick(View.java:4759)
                                                                        at android.view.View$PerformClick.run(View.java:19770)
                                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:135)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:5247)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at java.lang.reflect.Method.invoke(Method.java:372)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)

Upvotes: 0

Views: 87

Answers (1)

CommonsWare
CommonsWare

Reputation: 1006819

//If i placing here getApplicationContext() method then getting error

Correct. That is because the Application object does not know anything about themes, and your dialog needs a theme based on Theme.AppCompat. Always use your Activity context for creating dialogs.

You may wish to read Dave Smith's awesome blog post on the uses of different types of Context object for more on this.

Upvotes: 4

Related Questions