小编Don*_*rty的帖子

Android - 如何覆盖"后退"按钮,以便它不完成()我的活动?

我目前有一个活动,当它显示时,通知也将显示在通知栏中.

这样,当用户按下主页并将活动推送到后台时,他们可以通过通知返回活动.

当用户按下后退按钮时,问题就出现了,我的活动被破坏但是通知仍然存在,因为我希望用户能够按下但仍然能够通过通知进入活动.但是当用户尝试这个时,我会尝试Null Pointers尝试启动一项新活动,而不是重新启动旧活动.

所以基本上我希望Back按钮的行为与Home按钮完全相同,这是我到目前为止的尝试方式:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   
Run Code Online (Sandbox Code Playgroud)

但是上面的代码似乎仍然允许我的Activity被销毁,如何在按下后退按钮时阻止我的Activity被销毁?

android back-button nullpointerexception onkeypress android-activity

193
推荐指数
5
解决办法
32万
查看次数

Android - 相机预览是侧面的

我正在使用预览来显示相机在屏幕上看到的内容.

我可以使一切工作正常,表面创建,表面设置和表面显示.

但是,在纵向模式下,它始终以不正确的90度角显示图像.

如图中所示:

替代文字

我知道使用以下代码将直接设置图片:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)

但是我在Activity中有预览,其中包含其他元素,并且我的Activity在横向模式下显示没有意义.(默认禁用)

所以我想知道是否只是改变预览的方向?并在"纵向"模式下正确显示我的其余活动?

或者无论如何旋转预览以便正确显示?

camera android portrait preview orientation

123
推荐指数
3
解决办法
9万
查看次数

如何在Android项目上更改目标构建?

我目前在Eclipse中有一个Android项目.

我用1.5(sdk 3)的目标版本创建了它.

现在我想改变它,使它的minSdk为3,targetSdk为8.

要做到这一点,我发现我必须构建最新的SDK(2.2)

要在Eclipse中执行此操作,我右键单击我的项目,转到属性,单击Android并将项目构建目标更改为Android 2.2,然后单击"应用",然后单击"确定".

然而,这似乎没有任何影响,当我再次尝试时,目标构建设置回Android 1.5.

我错过了一步还是什么?

android build target

81
推荐指数
4
解决办法
16万
查看次数

CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及视图

我在Android中遇到以下错误的问题:

CalledFromWrongThreadException;:只有创建视图层次结构的原始线程才能触及其视图

它似乎发生在我尝试更新我的Activity中的Textview时,更新TextView的调用来自我的Activity,但我仍然得到上述错误.

我喜欢这样:

onCreate() - 设置按钮和文本视图.

onStateChange() - 一个关于状态更改通知的侦听器,当收到通知时,如果将TextView更改为说一些不同的文本.

当我收到新文本的通知时,我尝试更改TextView,如下所示:

((TextView)findViewById(R.id.title)).setText("Some Text");
Run Code Online (Sandbox Code Playgroud)

但是我得到了上面的错误.

从谷歌搜索它,似乎我应该使用处理程序来更改TextView或使用AsyncTask?

任何人都可以解释哪一个更好用,为什么?

编辑:新增代码片段:


     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  

            setContentView(R.layout.my);

            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);  

            ((TextView)findViewById(R.id.time)).setText("Hello Text");


            findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"));
                    startActivity(dialIntent);

                        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD));
                        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));       
                }
        });

     }
Run Code Online (Sandbox Code Playgroud)
//CallBacks from running Service

private final ICallDialogActivity.Stub iCallDialogActivity = new ICallDialogActivity.Stub(){

@Override
public void onStateChanged(int callState)
                throws RemoteException {    
            switch(callState){
            case GlobalData.CALL_STATUS_IDLE:

                break;

            case GlobalData.CALL_STATUS_DISCONNECTING:
                byeSetup();
                break;
    } …
Run Code Online (Sandbox Code Playgroud)

android handler android-asynctask

47
推荐指数
2
解决办法
5万
查看次数

从Service更新UI的方式比意图更有效?

我目前在Android中有一个服务,它是一个示例VOIP客户端,因此它会侦听SIP消息,如果它收到一个,它会启动一个带有UI组件的活动屏幕.

然后,以下SIP消息确定要在屏幕上显示活动的内容.例如,如果它的来电将显示接听或拒绝或拨出电话,它将显示拨号屏幕.

在那一刻,我使用Intents让Activity知道它应该显示的状态.

一个例子如下:


        Intent i = new Intent();
        i.setAction(SIPEngine.SIP_TRYING_INTENT);
        i.putExtra("com.net.INCOMING", true);
        sendBroadcast(i);

        Intent x = new Intent();
        x.setAction(CallManager.SIP_INCOMING_CALL_INTENT);
        sendBroadcast(x);
        Log.d("INTENT SENT", "INTENT SENT INCOMING CALL AFTER PROCESSINVITE");
Run Code Online (Sandbox Code Playgroud)

因此,活动将为这些意图注册广播接收器,并根据收到的最后意图切换其状态.

示例代码如下:


       SipCallListener = new BroadcastReceiver(){

            @Override
            public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction(); 

                    if(SIPEngine.SIP_RINGING_INTENT.equals(action)){
                        Log.d("cda ", "Got RINGING action SIPENGINE");
                        ringingSetup();
                    }         

                    if(CallManager.SIP_INCOMING_CALL_INTENT.equals(action)){
                        Log.d("cda ", "Got PHONE RINGING action");
                        incomingCallSetup();
                    }  
            }
        };
        IntentFilter filter = new IntentFilter(CallManager.SIP_INCOMING_CALL_INTENT);
        filter.addAction(CallManager.SIP_RINGING_CALL_INTENT);
        registerReceiver(SipCallListener, filter);
Run Code Online (Sandbox Code Playgroud)

这可行,但它似乎不是非常有效,Intents将获得广播系统范围和Intents必须为不同状态触发似乎它可能变得低效,我必须包括更多,以及增加复杂性.

所以我想知道是否有更高效,更清洁的方法来做到这一点?

有没有办法让Intents只在应用程序内部广播?

回调是一个更好的主意吗?如果是这样,为什么以及以何种方式实施它们?

performance service user-interface android android-intent

41
推荐指数
1
解决办法
2万
查看次数

Android - 使用Timer和TimerTask控制任务?

我目前正在尝试在我的Android应用程序中设置WiFi扫描,每隔30秒扫描一次WiFi接入点.

我已经使用Timer和TimerTask以我需要的间隔正确运行扫描.

但是我希望能够在用户按下按钮时停止并开始扫描,我当前无法停止然后重新启动Timer和TimerTask.

这是我的代码

TimerTask scanTask;
final Handler handler = new Handler();
Timer t = new Timer();

public void doWifiScan(){

scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {
                         wifiManager.scan(context); 
                         Log.d("TIMER", "Timer set off");
                        }
               });
        }};


    t.schedule(scanTask, 300, 30000); 

 }

  public void stopScan(){

   if(scanTask!=null){
      Log.d("TIMER", "timer canceled");
      scanTask.cancel();
 }

}
Run Code Online (Sandbox Code Playgroud)

所以Timer和Task启动正常并且扫描每30秒发生一次但是我不能让它停止,我可以停止Timer但是任务仍然发生并且scanTask.cancel()似乎也不起作用.

有一个更好的方法吗?或者我在Timer/TimerTask类中遗漏了什么?

android timer scheduled-tasks

37
推荐指数
3
解决办法
8万
查看次数

Android - 密钥调度超时

在我的Android应用程序中,我遇到了一个非常奇怪的崩溃,当我在我的UI上按下一个按钮(图像)时,整个应用程序冻结,几秒钟后我就会出现可怕的强制关闭对话框.

以下是在日志中打印的内容:


WARN/WindowManager(88): Key dispatching timed out sending to package name/Activity
WARN/WindowManager(88): Dispatch state: {{KeyEvent{action=1 code=5 repeat=0 meta=0 scancode=231 mFlags=8} to Window{432bafa0 com.android.launcher/com.android.launcher.Launcher paused=false} @ 1281611789339 lw=Window{432bafa0 com.android.launcher/com.android.launcher.Launcher paused=false} lb=android.os.BinderProxy@431ee8e8 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{4335fc58 package name/Activity paused=false}}}
WARN/WindowManager(88): Current state:  {{null to Window{4335fc58 package name/Activity paused=false} @ 1281611821193 lw=Window{4335fc58 package name/Activity paused=false} lb=android.os.BinderProxy@434c9bd0 fin=false gfw=true ed=true tts=0 wf=false fp=false mcf=Window{4335fc58 package name/Activity paused=false}}}
INFO/ActivityManager(88): ANR in process: package name (last in package name)
INFO/ActivityManager(88): Annotation: keyDispatchingTimedOut
INFO/ActivityManager(88): …
Run Code Online (Sandbox Code Playgroud)

android timeout key freeze dispatch

37
推荐指数
2
解决办法
5万
查看次数

Android - 通过耳机播放音频

我目前有代码使用AudioRecord类从设备mic读取录音,然后使用AudioTrack类播放.

我的问题是,当我播放它时,它通过扬声器电话播放.

我希望它通过设备上的耳机播出.

这是我的代码:

public class LoopProg extends Activity {

 boolean isRecording; //currently not used
 AudioManager am;
 int count = 0;

 /** Called when the activity is first created. */
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        am.setMicrophoneMute(true);
        while(count <= 1000000){
        Record record = new Record();  
        record.run();
        count ++;
        Log.d("COUNT", "Count is : " + count);
        }
    } 

   public class Record extends Thread{
      static final int bufferSize = 200000;
      final short[] buffer = new short[bufferSize]; …
Run Code Online (Sandbox Code Playgroud)

audio android routes

33
推荐指数
2
解决办法
5万
查看次数

使用SimpleCursorAdapter从Cursor更改值

我有数据库表,列{名称,时间(UTC格式),纬度,经度}

我使用带有SimpleCursorAdapter的ListActivity显示表.

我希望列Time以人类可读格式显示时间(13-07-2010 10:40)而不是UTC格式(18190109089).

如何指定列Time中的值需要一些过滤/适应?

可能的解决方案(有问题):

SimpleCursorAdapter提供的方法:

setCursorToStringConverter(SimpleCursorAdapter.CursorToStringConverter cursorToStringConverter);
Run Code Online (Sandbox Code Playgroud)

指定一个能够将Cursor转换为CharSequence的类(convertToString(Cursor cursor).无论如何我不知道返回CharSequence参数的格式应该是多少!

sqlite android filtering cursor

27
推荐指数
2
解决办法
2万
查看次数

调用stopService方法时,服务不会停止

我目前有一个运行正常的服务,但是当我尝试使用stopService方法停止它时,它的onDestroy方法不会被调用.

这是我用来尝试停止服务的代码

stop_Scan_Button =(Button)findViewById(R.id.stopScanButton);

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        Log.d("DEBUGSERVICE", "Stop Button pressed");
        Intent service = new Intent(CiceroEngine. CICERO_SERVICE);
        releaseBind();
        Log.d("Stop_Scan_Button", "Service: " + service.toString());
        stopService(service);
        Log.d("Stop_Scan_Button", "Service should stop! ");

        }   
});
Run Code Online (Sandbox Code Playgroud)

我是否正确地认为当使用stopService时它会调用服务的onDestroy方法?当我按下停止扫描按钮时onDestroy(),我的服务中的方法不会被调用.

还有什么我错过了我应该停止服务吗?

编辑:添加onServiceConnected()在运行stopService时调用的调用onServiceDisconnected(),为什么会发生这种情况?

编辑:添加更多信息关于绑定

我在onCreate()方法中调用bindService,然后让releaseBind()方法取消绑定服务.

以下是该方法的代码:

 public void releaseBind(){
    unbindService(this);
  }
Run Code Online (Sandbox Code Playgroud)

所以我认为解除绑定不是我的问题?

service android

25
推荐指数
2
解决办法
7万
查看次数