小编nha*_*man的帖子

强制关闭后音频继续播放

首先,感谢您对这个伟大的网站,我通过搜索这里回答的问题找到了大量的信息.但是我有一个问题,我只发现了一个(没有答案).

我正在编写一个应用程序,它使用AudioTrack通过耳机插孔循环运行时生成的正弦波(以控制其他电子设备).它以定时间隔(使用Handler.postDelayed)执行此操作,并且它工作正常 - 除非您碰巧强制关闭应用程序.在这种情况下,即使在应用程序本身已经过去之后,正弦波仍在继续播放,而字面上我唯一能做的就是重启手机.

如果应用程序正确关闭,即使它崩溃,声音就会停止.

我试过了:

  • 创建一个onDestroy()方法来停止和释放AudioTrack实例,但不幸的是,它甚至都没有被调用.
  • 为声音循环使用更大的音频缓冲区(希望小缓冲区大小导致错误); 没有不同.
  • 再次启动我的应用程序:现在我有两个正常的正弦波!
  • 完全卸载(!)应用程序:正弦波仍然在那里困扰着我的坟墓.
  • 将手机置于静音模式:没有区别.(我不希望这发生在我的用户身上.)
  • 将媒体音量一直调低,等待15分钟以上:没有区别.
  • 将采样率更改为11,22或44.1 kHz:无差异.
  • 一次又一次地开始和杀死应用程序:我实际上可以通过这种方式让8种不同的不朽正弦波相互干扰.实际上非常酷.:P

我知道在Android上使用任务杀手并不"健康",但很多人仍然这样做,而且我不希望我的用户的手机变成不可阻挡的噪音发生器,以防我的应用程序碰巧挂起并让它的屁股发出声响.

以下是生成正弦波的代码:

int bufSize = (int)(11025.0 / 60.0); // the number of samples needed for a seamless loop at 60Hz
AT = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STATIC);

byte buffer[] = new byte[bufSize];

float angle = 0.0f;
for (int i=0; i < bufSize; i++){
    buffer[i] = (byte)(Math.sin(angle) * 255);
    angle += (float)(2*Math.PI) * 60 / 11025;
}

if (AT.write(buffer, 0, bufSize) != bufSize){ …
Run Code Online (Sandbox Code Playgroud)

audio android taskkill

7
推荐指数
1
解决办法
1783
查看次数

替代使用LinearLayouts的嵌套权重

我想实现以下目标:

在此输入图像描述

它适用于以下布局:

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

    <LinearLayout
        android:layout_weight="3"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <fragment 
            android:name="com.bobjohn.DetailsMenuFragment"
            android:id="@+id/detailsMenuFragment"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="6"
            />

        <fragment 
            android:name="com.bobjohn.SummaryFragment"
            android:id="@+id/summaryFragment"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_margin="10dp"
            android:layout_weight="4"/>
    </LinearLayout>

    <TextView 
        android:layout_width="0dp"
        android:layout_weight="7"
        android:layout_height="fill_parent"
        android:text="Test Text"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

但是,我收到有关嵌套权重对性能不利的警告.我理解错误,但我不知道如何以另一种方式表达这种布局.有什么选择?

android android-layout

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

未调用TimePickerDialog.onTimeSetListener

我正在使用以下代码来显示TimePickerDialog:

TimePickerDialog dialog = new TimePickerDialog(this, new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            System.out.println("onTimeSet");
        }
    }, 20, 15, true);
    dialog.setTitle("Test");
    dialog.setButton(TimePickerDialog.BUTTON_POSITIVE, "Done", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            System.out.println("Done");
        }
    });
    dialog.setButton(TimePickerDialog.BUTTON_NEGATIVE, "Cancel", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            System.out.println("Cancel");
        }
    });
    dialog.show();
Run Code Online (Sandbox Code Playgroud)

在运行Android 2.3.7的设备上,onTimeSet不会调用该onClick方法(方法可以).在运行4.2.2的设备上,onTimeSet确实会调用它.

这里发生了什么?

android

7
推荐指数
1
解决办法
3766
查看次数

GoogleAuthException:使用Cloud Endpoints进行身份验证时未知

我正在尝试向我的Cloud Endpoints添加身份验证,但我无法让它工作.我正在使用此博客作为指南:http://devthots.blogspot.nl/2012/07/building-awesome-android-apps-with.html

是)我有的:

在AppEngine项目中:

@Api(name = "noteendpoint", clientIds = { "123456789012-abcdefghijklmnopqrstuvwxyz012345.apps.googleusercontent.com" }, audiences = { "my_project_id.appspot.com" }, namespace = @ApiNamespace(ownerDomain = "example.com", ownerName = "example.com", packagePath = "myapp"))
public class NoteEndpoint {
   // Rest of class, added parameter User to all methods.
}
Run Code Online (Sandbox Code Playgroud)

在我的Android应用项目中:

Note note = new Note();     
note.setDescription("Description!");

GoogleAccountCredential credential = 
    GoogleAccountCredential.usingAudience(MainActivity.this, "my_project_id.appspot.com");
credential.setSelectedAccountName(ACCOUNT_NAME);

note.setEmailAddress(credential.getSelectedAccountName());

Builder endpointBuilder = new Noteendpoint.Builder(
    AndroidHttp.newCompatibleTransport(),
new JacksonFactory(), credential);

Noteendpoint endpoint = CloudEndpointUtils.updateBuilder(endpointBuilder).build();
Note result = endpoint.insertNote(note).execute(); // Exception thrown …
Run Code Online (Sandbox Code Playgroud)

google-app-engine android google-cloud-endpoints

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

Square Retrofit Client:如何启用/禁用followRedirects?如何拦截重定向网址?

我正在使用Square的Retrofit Client从Android应用程序发出简单的请求.像这样:

  RestAdapter restAdapter = new RestAdapter.Builder()
            .setServer(Configurations.getInstance().plistMap.get("PTBaseURL"))
            .setRequestHeaders(new RequestHeaders() {
                @Override
                public List<Header> get() {
                    List<Header> headers = new ArrayList<Header>();
                        Header authHeader = new Header("Authorization", authType + " " + UserManager.getInstance().currentUser.token);
                        headers.add(authHeader);
                    }
                    return headers;
                }
            })
            .build();

    this.service = restAdapter.create(ClientInterface.class);
Run Code Online (Sandbox Code Playgroud)

一个端点重定向到不同的URL(s3).由于对此问题不重要的原因,重定向请求失败,因此我的callback.failure(error)方法被调用.我需要能够在某些时候访问和修改重定向URL或请求,最好是在callback.failure().我怎样才能做到这一点?

或者,有没有办法设置类似的东西followRedirects = false(并以这种方式拦截重定向)?

java networking android retrofit

7
推荐指数
1
解决办法
6005
查看次数

具有嵌套共享元素的场景转换

我正在尝试使用Transitions API为两个ViewGroup之间的共享元素设置动画.目标是绿色视图从"父母的边界"向"新位置"移动.

在此输入图像描述 在此输入图像描述 在此输入图像描述

我有以下布局:

first.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <FrameLayout
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:background="#f00" />

  <FrameLayout
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:background="#00f">

    <View
      android:id="@+id/myview"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:layout_gravity="center"
      android:background="#0f0" />

  </FrameLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

second.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <FrameLayout
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:background="#f00">

    <View
      android:id="@+id/myview"
      android:layout_width="100dp"
      android:layout_height="100dp"
      android:layout_gravity="center"
      android:background="#0f0" />

  </FrameLayout>

  <FrameLayout
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:background="#00f" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

但是,我无法让它正常工作.默认转换只是淡出所有内容,ChangeBounds转换什么都不做,而且ChangeTransform看起来也不正确.

我正在使用的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final ViewGroup root = (ViewGroup) findViewById(android.R.id.content);

    setContentView(R.layout.first);
    View myView1 = findViewById(R.id.myview);
    myView1.setTransitionName("MYVIEW");

    new …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-transitions

7
推荐指数
1
解决办法
1613
查看次数

Android模拟器:无法分配内存:8甚至8MB RAM

我正在尝试启动模拟器,但我不断收到错误Failed to allocate memory: 8.

有一些解决这个问题的方法,将RAM设置为1024到512,但是当我将它设置为8时,它仍然会因此错误而崩溃!

我该怎么办?

设置屏幕截图:

在此输入图像描述

这里给出了崩溃的模拟器arm.exe的错误消息:

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: emulator-arm.exe
  Application Version:  0.0.0.0
  Application Timestamp:    4fe779fb
  Fault Module Name:    emulator-arm.exe
  Fault Module Version: 0.0.0.0
  Fault Module Timestamp:   4fe779fb
  Exception Code:   40000015
  Exception Offset: 0014428e
  OS Version:   6.1.7600.2.0.0.768.3
  Locale ID:    1043
  Additional Information 1: ea2b
  Additional Information 2: ea2b4716fbf9f89aacc15214fb1537bb
  Additional Information 3: 8d2f
  Additional Information 4: 8d2f162ccf8522e475fc4fbe036a6efa
Run Code Online (Sandbox Code Playgroud)

我最后一次检查和模拟器工作是在更新到ADT 20之前和删除所有旧的AVD之前.

android android-emulator

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

适用于4x2 appwidget的大小

我正在尝试创建一个标准尺寸为4x2图块的appwidget.目前,我正在使用这些值:

android:minHeight="146dp"
android:minWidth="294dp"
Run Code Online (Sandbox Code Playgroud)

在我的欲望运行姜饼,小部件显示为4x2.
在运行ICS的华硕TF101平板电脑上,小部件的大小为4x2.
最后,在运行ICS的模拟器720x1280中,窗口小部件的大小为4x3.

所以我在这里有点困惑.在所有设备上实现4x2小部件的正确值(可能使用不同的资源文件夹)是什么?

android android-appwidget

6
推荐指数
1
解决办法
4423
查看次数

了解Android应用程序中的内存泄漏

我发现文章"避免内存泄漏",据说下面的代码:

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

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

不是一个好主意,因为:

当屏幕方向改变时,系统默认会破坏当前活动并创建新活动,同时保留其状态.这样,Android将从资源重新加载应用程序的UI.

那么上面的代码:

...泄漏第一次屏幕方向更改时创建的第一个活动.将Drawable附加到视图时,视图将设置为drawable上的回调.在上面的代码片段中,这意味着drawable具有对TextView的引用,TextView本身具有对活动(Context)的引用,而Activity又引用了几乎所有内容(取决于您的代码).

但是,当屏幕方向改变时,调用方法setBackgroundDrawable(Drawable background),然后调用:

background.setCallback(this);
Run Code Online (Sandbox Code Playgroud)

该方法Drawable.setCallback()以下列方式定义:

public final void setCallback(Callback cb) {
    mCallback = new WeakReference<Callback>(cb);
}
Run Code Online (Sandbox Code Playgroud)

因此,现在后台应该释放对前一个TextView的旧引用,并且应该创建对新TextView的新引用.

因此,似乎更改屏幕方向只会泄漏参考,直到新创建活动.

我哪里错了?

java android memory-leaks android-layout android-view

6
推荐指数
1
解决办法
575
查看次数

无法使用Android从测试源访问内部组件

我有以下结构:

build.gradle
src
 - main
   - AndroidManifest.xml
   - kotlin 
     - pkg
       - MyClass.kt (internal class MyClass)
 - test
   - kotlin
     - pkg
       - MyClassTest.kt   
Run Code Online (Sandbox Code Playgroud)

MyClassTest.kt我参考internal class MyClass.


build.gradle:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
//apply plugin: 'java'
//apply plugin: 'kotlin'

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.2"

  sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
    test.java.srcDirs += 'src/test/kotlin'
  }
}

dependencies {
  testCompile 'junit:junit:4.12'
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

buildscript {
  ext.kotlin_version = '1.0.0-beta-2423'
  repositories {
    mavenCentral()
  }
  dependencies { …
Run Code Online (Sandbox Code Playgroud)

android kotlin

6
推荐指数
1
解决办法
1017
查看次数