1

私はダミーのために Android を読み始め、Silent Mode Toggle という最初のアプリを作ろうとしています。

今私が直面している問題は次のとおりです。

レイアウトには、ボタンが 1 つだけあるようなものが必要です。電話機がサイレント モードの場合、テキストは「サイレント モードが有効化されました」と表示され、電話機が通常モードの場合は「ノーマル モードが有効化されました」と表示されます。

バイブレーション モードを有効にするかどうかをユーザーに確認する必要があります。

以下は私のコードです:

XML レイアウト

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >    

    <ImageView
        android:id="@+id/phone_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="7dp"
        android:src="@drawable/phone_on" />

    <Button
        android:id="@+id/silent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="35dp"
        android:text="@string/silent_off" />

</LinearLayout>

Java コード

public class MainActivity extends Activity {
    private AudioManager mAudioManager;
    private boolean mPhoneIsSilent;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        super.onCreate(savedInstanceState);
        mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
        checkIfPhoneIsSilent();
        setButtonClickListener();
        Log.d("SilentModeApp", "This is a test");
    }    

    private void setButtonClickListener() {
        Button toggleButton = (Button)findViewById(R.id.silent);
        toggleButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (mPhoneIsSilent) {
                    //change back to normal mode
                    mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    mPhoneIsSilent = false;
                }
                else
                {
                    //change to silent mode
                    mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                    mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    mPhoneIsSilent = true;
                }
                // Now toggle the UI again
                toggleUi(); 
            }
        });
    }

    private void checkIfPhoneIsSilent() {
        int ringermode = mAudioManager.getRingerMode();
        if (ringermode == AudioManager.RINGER_MODE_SILENT) {
            mPhoneIsSilent = true;
        }
        else
        {
            mPhoneIsSilent = false;
        }
    }

    private void toggleUi() {
        ImageView imageView = (ImageView) findViewById(R.id.phone_icon);
        Drawable newPhoneImage;
        if (mPhoneIsSilent){
            newPhoneImage = 
                    getResources().getDrawable(R.drawable.phone_silent);
        }
        else
        {
            newPhoneImage = 
                    getResources().getDrawable(R.drawable.phone_on);

        }
        imageView.setImageDrawable(newPhoneImage);
    }

    @Override      
    protected void onResume() {
        super.onResume();
        checkIfPhoneIsSilent();
        toggleUi();
    }
}

アップデート

これで、「mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);」を削除し、通常モードから振動モードに移行しました。

レイアウトのことで助けが必要です。

3 つのボタンとテキスト ステータス テキストが必要です。ボタンとテキスト メッセージの作成方法は知っていますが、それを Java と統合する方法はわかりません。

電話が通常モードの場合、ボタンの上の画像の下にステータス メッセージが表示される必要があります。

電話機が通常モードの場合、ボタンは 2 つだけである必要があります: サイレント モードに切り替え、バイブレーション モードに切り替えます。

他のモードでも同じです。

4

2 に答える 2

1

サイレントモードがアクティブになっているかどうかを示すテキストビューが必要なようです。つまり、ボタンの近くにあるほんの少しのテキストで、ステータスが表示されますか?また、ボタンも動的に表示/非表示になりますか?

TextView tv = (TextView)findviewbyid(R.id.relevanttextview); //text above button/wherever
Button bt = (Button)findviewbyid(R.id.relevantbutton); //button to make appear/dissapear 

if(vibrate is on){
tv.setText("vibrate is on");
bt.setVisibility(View.VISIBLE); //make button appear
}

if(normal mode is on){
tv.setText("normal");
bt.setVisibility(View.INVISIBLE); //make button dissapear
}

等...

于 2012-09-02T18:41:25.563 に答える
0
AndriodManifest.xml
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>


package com.example.myapplication;

import android.Manifest;
import android.app.AlertDialog;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Handler;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import static android.app.NotificationManager.*;


public class MainActivity extends AppCompatActivity {
    AudioManager audioManager;
    //private int CAMREA_CODE = 1;

    private int MOD_ADO_CODE=1;
    private NotificationManager mNotificationManager;
    private StatusBarNotification[] mText;
    private int MZenMode;
    private static final String TAG = "ZenModeObserver";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        setContentView(R.layout.activity_main);
        FrameLayout contentView = (FrameLayout) findViewById(R.id.content);
        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        contentView.setOnClickListener(
                new View.OnClickListener() {
                    public void onClick(View v) {
                        //RingerHelper.performToggle(audioManager);
                        //Toast.makeText(MainActivity.this, Policy, Toast.LENGTH_SHORT).show();
                        try {
                            MZenMode=logZenModeState();
                        } catch (Settings.SettingNotFoundException e) {
                            e.printStackTrace();
                        }
                        if (MZenMode==2)
                            changeInterruptionFiler(INTERRUPTION_FILTER_ALL);
                        else
                            changeInterruptionFiler(INTERRUPTION_FILTER_NONE);
                        updateUi();
                    }
                }
        );
    }
    private void updateUi() {
        ImageView imageView = (ImageView) findViewById(R.id.phone_icon);
        int phoneImage = MZenMode==2?R.drawable.ringer_off : R.drawable.ringer_on;
        //int phoneImage = RingerHelper.isPhoneSilent(audioManager) ? R.drawable.ringer_off : R.drawable.ringer_on;
        imageView.setImageResource(phoneImage);
    }

    protected void changeInterruptionFiler(int interruptionFilter) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (mNotificationManager.isNotificationPolicyAccessGranted()) {
                mNotificationManager.setInterruptionFilter(interruptionFilter);

            } else {
                Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
                startActivity(intent);
            }
        }
    }

    private int logZenModeState() throws Settings.SettingNotFoundException {
        int zenModeValue = Settings.Global.getInt(getContentResolver(), "zen_mode");
        return zenModeValue;
    }

    private class ZenModeObserver extends ContentObserver {

        ZenModeObserver(Handler handler) {
            super(handler);
        }
    }
        @Override
    protected void onResume()
    {
        super.onResume();
        updateUi();
    }

}
于 2020-02-18T16:38:32.463 に答える