2015年3月31日星期二

MediaPlay:音频播放器

1)如何获得MediaPlayer实例:
   可以使用直接new的方式:
   MediaPlayer mp = new MediaPlayer();
   也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource

2) 如何设置要播放的文件:
   MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
   例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
   例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

MediaPlayersetDataSource一共四个方法:
       setDataSource (String path)
       setDataSource (FileDescriptor fd)
       setDataSource (Context context, Uri uri)
   setDataSource (FileDescriptor fd, long offset, long length)

3)对播放器的主要控制方法:
Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
prepare()prepareAsync()  提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,
pause()stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。


4)设置播放器的监听器:
   MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
setOnErrorListener(MediaPlayer.OnErrorListener listener),设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。

duplicateParentState: 保持跟父窗口的窗台保持一致

duplicateParentState="ture"的话 会跟父窗口的状态栏保持一致


<ImageView
                    android:id="@+id/btn_push_setting"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/selector_setting_btn"
                    android:duplicateParentState="true" />

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">


    <item
        android:state_selected="true"
        android:drawable="@drawable/btn_toggle_on" />

    <item
        android:drawable="@drawable/btn_toggle_off"/>

</selector>

这个例子想说明的是 因为你跟父窗口保持一致了 当点击的按下的时候即使点击
别的也会保持状态的。

2015年3月28日星期六

2015年3月26日星期四

delegate(委托)

delegate是 说白了 我要做的事儿 委托别人去做。

我要做什么事儿那必须得把自己要做的事儿发布出去,至于谁要接这个委托,那就要在委托方进行委托操作了。


@interface 接受委托方:要进行委托的类<委托名称(这个名称是随意)>
{
   类A *view;//假设 -(void)委托方法A:NSString *param1; 这个方法在 类A下
}

-(void)委托方法A:NSString *param1;
@end

@implementation 委托方

-viewDiaload{
  view=[[类A alloc] init];
  //把这个类名设置为委托,那么在别的类中调用了 类A中的 委托方法A的话那么就会进入到 接受委托方类里的 委托方法A中去, 因为在interface里已经定义里 类A中的相同类型的方法(注意如果方法名要跟类A里的保持一致).
  [view delegate:self];

}


-(void)委托方法A:NSString *param1{


}

@end




객체 생성하기(alloc,release)

alloc와 release는 묶어서 나타나야 한다.

alloc는 메모리를 할당하는 것이고 release는 반납하겠다는 뜻이다.

예문
sample =[[MySample alloc] init];
[sample release];


@synthesize와@property

이두가지로 선언했다면 해당 메서드를 자동으로 생성하도록 하는 지시어다.

@synthesize 는 get와set를 생략한다

@dynamic은 부모클래스에서 @synthesize된 getter와 setter를 사용하겠다고 선언

Xcode 4.4부터 .h가 property가 선언되었다면 .m에서 @synthesize를 사용하지 않아도
"_"만 붙으면 해당 synthesize world=_world와 같은 효과이다.

property的 strong以及weak

property의  strong과 weak는 ARC(XCode 5)가 도입되면서 추간된거다

strong:은 새로운 객체를 도입하면 해당 객체는 무조건 ratain된다.즉 해당객체를 사용하지 않으면
메모리가 자동 해제된다 .

weak: 해당객체가 메모리에서 해제될 때 자동으로 nil값을 대입해 준다


下面的描述写的比较明白。

property 中的strong 与weak

strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切

@property (nonatomic, strong) NSString *string1;   
@property (nonatomic, strong) NSString *string2;  

有这样两个属性,

 @synthesize string1;   
@synthesize string2;  


猜一下下面代码将输出什么结果?

self.string1 = @"String 1";   
self.string2 = self.string1;   
self.string1 = nil;  
NSLog(@"String 2 = %@", self.string2);  


结果是:String 2 = String 1

由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。

接着我们来看weak关键字:
如果这样声明两个属性:

@property (nonatomic, strong) NSString *string1;   
@property (nonatomic, weak) NSString *string2;  

并定义 
@synthesize string1;   
@synthesize string2;  



再来猜一下,下面输出是什么?

 self.string1 = @"String 1";   
self.string2 = self.string1;   
self.string1 = nil;  
NSLog(@"String 2 = %@", self.string2);  

结果是:String 2 = null

分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。

2015年3月25日星期三

关闭防火墙命令

[root@localhost jdk1.6.0_45]# /bin/systemctl restart iptables.service
[root@localhost jdk1.6.0_45]# /bin/systemctl status iptables.service


vi /etc/sysconfig/iptables 这是他的添加端口的路径

IOS页面的笔记--【storyboard调试画面大小】


首先看一下苹果屏幕都有哪些以及对应的尺寸.



1. 在storyboard上调节屏幕大小
   1-1: 首先取消自适应选项: .storyboard->点击viewcontroll->把Use Size Classes去掉
   1-2: 看如下图选择屏幕Size(大小是根据上边的图片可以适配)
 



2015年3月23日星期一

判断输入的是否为数字(js+jquery)

(/^\d+$/.test($('.phone3').val()))

2015年3月19日星期四

PHPStream 关键字自动补齐快捷键设置

在setting->keymap->find->Add Selection for Next Occurrence

2015年3月18日星期三

字符串正则表达式的使用

判断是否包含中文:if(/^[\u4e00-\u9fa5]/.test("名字"))
判断是否包含英文:   if(/^[a-zA-Z]/.test("abc"))

查看是不是数字
/^\d+$/.test("a111")

2015年3月16日星期一

PHP paging 第三方(GITHUB)

项目需要PHP的分页所以在网上找了插件.发现GITHUB里的挺不错.
记录一下:https://github.com/rafapaulino/Pagination

2015年3月12日星期四

PHP 静态变量的使用"::"

静态变量或者静态方法 都使用 '::'来调用访问

<?php
$ab=new a1();$ab->s1;
echo a1::$st1;
class a1{    var $s1;    public static $st1="static ";}?>

先来看代码

<?php?>

<?php
$vv="nishuone";?>


<input type="text" value="<?= $vv ?>" >

还可以
<input type="text" value="<?php echo $vv ?>" >

如果使用 <=?的话 需要short_open_tag.

PHP 保存 Excl文件.

先上代码.
要注意他的头部定义方式.必须要这样设置。当调用的时候就会直接下载成excl格式的了

<?php    
session_start();   
 $date = mktime();   
 $date = date("Y-m-d",$date);   
 $filename = "$date.xls";   
 header("Content-type: application/vnd.ms-excel");   
 header("Content-Disposition: attachment; filename=$filename");  
 header("Expires: 0");    
 header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); 
 header("Pragma: public");?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
</head>

<body>
<table border=1 width=100%>
    <tr>
        <td>아이디</td>
        <td>등급</td>
    </tr>
    <?php    for($i=1; $i<=5; $i++){        echo        "         <tr>         <td>$i</td>         <td>sm.$i</td>         </tr>         ";    }    ?>
</table>
</body>
</html>

通过判断写入静态部分

下面可以看到 <div>a1</div>部分是在 php的 if($s1)语句里,并且这里注意的是
<div>a1</div>包括在 if{}里边.所以在这里不满足时 不会显示 a1部分.
<?php?>

<?php$s1=false;?>

<?php if($s1) { ?>
    <div>a1</div>
<?php}else{    echo "a2";}?>

页面效果如下


2015年3月11日星期三

Android Studio 修改 package名称

这是在stackover-flow看见的.还是国外的牛人多

http://stackoverflow.com/questions/6600329/rename-full-android-package-name

解决方法是 把光标放在 package的值部分 shit+F6就可以了

Android Studio 使用 KakaoTalk(카카오톡 )

首先Kakaotalk的开发者网站是 https://developers.kakao.com/docs/android

因为开发者网的教程跟现在的AndroidStudio的方式有很大不同,所以我留个记录.

1.首先要在官网上注册应用信息,注册很简单.这里就直接跳过

2.生成keyshah文件.官网上给出的命令是
 keytool -exportcert -alias androiddebugkey -keystore <debug_keystore_path> -storepass android - keypass android | openssl sha1 -binary | openssl base64
 keytool是在 %JAVA_HOME%\bin下
 debug_keystore_pash是安装SDK的时候默认设置了debug.keystore
 一般会在 C:\user\用户名\.android\debug.keystore
 openssl: 如果你是windows用户那么你需要下一个openssl的插件,网上一大堆就不说了
 这里需要说明一下的是 debug.keystore的默认密码是android,所以在 -storepass以及
 -keypass上设置的都是android
 openssl下载:http://indy.fulgan.com/SSL/ 

3.生成android应用
下图可以发现 如果你创建一个应用的话那么需要添加keyhash.第二部就是用来输入这个的。
如果你是在多个机器开发的话也可以多条输入



4.在Android Studio上远程下载Library
看一下图就可以知道加了所需要的内容了.
因为官方给出的设置方式与现在的版本不符合所以需要修改输入.参考以下帖子
https://www.blogger.com/blogger.g?blogID=4311514898285371075#editor/target=post;postID=1458598018359076387;onPublishedMenu=posts;onClosedMenu=posts;postNum=0;src=postname


以上配置完成的话 就可以按照官网的内容进行添加了












2015年3月9日星期一

Android studio 使用Maven 远程下载Library(新老版本解释)

这是老外的一个帖子中找到的。很经典所以就收藏了


I want to try this library in my android project. I am using Android Studio 0.4.6.
The README.markdown file tells me to insert this inside pom.xml:
<!-- in the 'repositories' section -->
<repository>
  <id>keytwo.net</id>
  <name>Keytwo.net Repository</name>
  <url>http://audiobox.keytwo.net</url>
</repository>

<!-- in the 'dependencies' section -->
<dependency>
  <groupId>io.socket</groupId>
  <artifactId>socket.io-client</artifactId>
  <version>0.2.1</version> <!-- the desidered version -->
</dependency>
The problem is that I do not have any pom.xml. I created one in my project root directory and synced gradle settings but it does nothing. Till now I only used already compiled .jar files or used the gradle compile function.
How can I use this library in my project?
shareedit
up vote20down voteaccepted
Android Studio doesn't use Maven as its builder; it uses Gradle instead. Fortunately, Gradle can use Maven repositories to fetch dependencies, so it's a matter of taking that information that would go into the pom file and using it in Gradle format. These modifications go in the build.gradle file in your module's directory (not the build file in the project root directory).
First, set up the repository where it can find the dependency.
repositories {
    maven { url 'http://audiobox.keytwo.net' }
}
and then add the dependency itself by adding this line to your dependencies block:
dependencies {
    ...
    compile 'io.socket:socket.io-client:0.2.1'
}
shareedit

2015年3月6日星期五

PendingIntent.getBroadcast的注册广播



使用语句
[java] view plaincopy
  1. PendingIntent intent= PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags)  

获得PendingIntent,浏览了各类文章,大多数说了这种方法,但是基本上也就是止步于此,可是还有最重要的没有谈及,如何区别多个已注册的PendingIntent呢,看了一下PendingIntent.getBroadcast的javadoc,第四个参数flags意为标记,初步认为flags是标识各个PendingIntent的,于是在测试中设置了个全局变量
[java] view plaincopy
  1. public static int currentIntent=0;  

然后用currentIntent++作为第四个参数传递进去,测试,注册了两个监听,等待时间的到来,bingo,居然可以了,目测已经可以。可是继续深入时问题来了,我要传递参数怎样?正解做法就是在第三个参数中设置
[java] view plaincopy
  1. intent.setExtra(String key,String value);  //设置传递的参数  

然后在自己实现的Receiver里用传进来的参数Intent intent实现
[java] view plaincopy
  1. intent.getIntegerExtra(String key);  

就可以获得参数,可以真正在实现的时候发现,在receiver里始终取不到参数,再经过一番查找,发现要把PendingIntent.getBroadcast的第四个参数设置于PendingIntent.FLAG_UPDATE_CURRENT,设置后测试,果然可以,可是这样问题又出来了,又要如何区别注册的intent呢?再次查看getBroadcast的javadoc,几个参数都没有说明如何区别要注册的PendingIntent,反而看到第二个参数的说明很神奇,就是这个参数目前为保留状态,仍未用到,无奈中,继续search各种说法,才发现,用requestCode来区别居然是可以的(可是为什么javadoc要说该参数未被使用呢?不解;估计用于区分PendingIntent的方法就是其中任意一个参数不同便可以区分了)代码如下:
设置监听
[java] view plaincopy
  1. Intent setAlertIntent=new Intent(this,AlertReceiver.class);  
  2. setAlertIntent.putExtra("try""i'm just have a try");  
  3. PendingIntent pendingIntent=PendingIntent.getBroadcast(this, alarmCount++, setAlertIntent,PendingIntent.FLAG_UPDATE_CURRENT);  
  4.   
  5. AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);  
  6. alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);  

Receiver中获取传递的数据:
[java] view plaincopy
  1. public void onReceive(Context context, Intent intent) {  
  2.     // TODO Auto-generated method stub  
  3.     Bundle bundle= intent.getExtras();  
  4.     if(bundle==null){  
  5.         Toast.makeText(context,"nothing", Toast.LENGTH_LONG).show();  
  6.     }else{  
  7.         Set<String> set=bundle.keySet();  
  8.         for(String item:set){  
  9.             System.out.println(item);  
  10.             System.out.println(".............");  
  11.         }  
  12.         Toast.makeText(context,bundle.getCharSequence("try"), Toast.LENGTH_LONG).show();  
  13.     }  
  14.       
  15. }