5.《第一行代码》笔记二

六、 文件读写、SharePreferences、SQLite
文件写:

    FileOutputStream out = null;
    BufferedWriter writer = null;
    try {
        out = openFileOutput("data", Context.MODE_PRIVATE);
        writer = new BufferedWriter(new OutputStreamWriter(out));
        writer.write(inputText);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (writer != null)
                writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

文件读:

    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuilder content = new StringBuilder();
    try {
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while ((line = reader.readLine()) != null) {
            content.append(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return content.toString();

SharedPreference:

        SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
        editor.putString("name","bob");
        editor.apply();
        SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
        String name = pref.getString("name","");
        Log.d("MainAcitivity","name is " + name);

SQLite:

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "create table Book(id integer primary key autoincrement,author text,price real,pages integer,name text)";
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
        super(context,name,factory,version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        
    }
}

建表:

    private MyDatabaseHelper dbHelper;
        dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
                dbHelper.getWritableDatabase();

用SQL语句CURD操作:

db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"The Da","bob","458","233"});
db.execSQL("update Book set price = ? where name = ?",new String[]{"666","The Da"});
db.execSQL("delete from Book where pages > ?",new String[]{"233"});
db.rawQuery("select * from Book",null);

添加一个新表:

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "create table Book(id integer primary key autoincrement,author text,price real,pages integer,name text)";
    public static final String CREATE_CATEGORY = "create table Category(id integer primary key autoincrement,catogory_name text,category_code integer)";
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
        super(context,name,factory,version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);

添加数据:

SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","bob");
values.put("author","bob author");
values.put("pages",458);
values.put("price",666);
db.insert("Book",null,values);

更新:

SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",233);
db.update("Book",values,"name=?",new String[]{"bob"});

删除:

QLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages > ?",new String[]{"100"});

查询:

SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Book",null,null,null,null,null,null);
if (cursor.moveToFirst()) {
    do {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        Log.d("MainActivity",name);
    }while (cursor.moveToNext());
}
cursor.close();

LitePal:
地址:https://github.com/LitePalFramework/LitePal
compile 'org.litepal.android:core:1.6.0'

1。main目录下新建assets目录,新建lite.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
    <litepal>
    <dbname value="BookStore" ></dbname>
    <version value="1"></version>
    <list>
    </list>
</litepal>

2。修改manifest文件,在application标签下增加:

android:name="org.litepal.LitePalApplication"

3。新建Book类:

public class Book extends DataSupport{
    private int id;
    private String author;
    private double price;
    private int pages;
    private String name;
    private String press;
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    public String getAuthor(){
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public double getPrice(){
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public int getPages(){
        return pages;
    }
    public void setPages(int pages){
        this.pages = pages;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getPress(){
        return press;
    }
    public void setPress(String press){
        this.press = press;
    }
}

4。把BOOK类映射到litepal中:

<list>
    <mapping class="com.lewanjiang.litepalt.Book" ></mapping>
</list>

5。新建数据库:

        Connector.getDatabase();

6。添加字段——修改book类,添加category表,新建category类,并在litepal中添加映射关系:

public class Category {
    private int id;
    private String categoryName;
    private int categoryCode;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public int getCategoryCode() {
        return categoryCode;
    }

    public void setCategoryCode(int categoryCode) {
        this.categoryCode = categoryCode;
    }
}

<?xml version="1.0" encoding="utf-8" ?>
    <litepal>
    <dbname value="BookStore" ></dbname>

    <version value="2"></version>

    <list>
        <mapping class="com.lewanjiang.litepalt.Book" ></mapping>
        <mapping class="com.lewanjiang.litepalt.Category"></mapping>
    </list>
</litepal>

7。添加数据:

        Book book = new Book();
        book.setName("The Da Vinci Code");
        book.setAuthor("Dan Brown");
        book.setPages(458);
        book.setPrice(16.96);
        book.setPress("Unknow");
        book.save();

8。更新数据:
8.1刚添加即修改:

Book book = new Book();
book.setName("bob");
book.setAuthor("bob author");
book.setPrice(233);
book.setPages(666);
book.setId(1);
book.save();
book.setPrice(10.99);
book.save();

8.2从已添加的中修改:

book.setPrice(14.95);
book.setPages(333);
book.updateAll("name=? and author =?","bob","bob author");

9。删除数据:

        DataSupport.deleteAll(Book.class, "price < ?", "15");

10。查询数据:

        List<Book> books = DataSupport.findAll(Book.class);
        for (Book book : books)
            Log.d("MainAcitivity", "book name is " + book.getName());

List<Book> books1 = DataSupport.select("name","author","pages")
.where("pages>?","400")
.order("pages")
.limit(10)
.offset(10)
.find(Book.class);



七、内容提供器
运行时权限:

Button makeCall = (Button) findViewById(R.id.make_call);
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
} else {
call();
}
}
});

private void call() {
    try {
        Intent intent = new Intent(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:10001"));
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                call();
            } else {
                Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
            }
            break;
        default:
    }
}

访问其他程序中的数据:
读取联系人:

ListView contactsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1);
} else {
readContacts();
}
}

private void readContacts(){
    Cursor cursor = null;
    try {
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactsList.add(displayName + "\n" + number);
            }
            adapter.notifyDataSetChanged();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                readContacts();
            } else {
                Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
            }
            break;
        default:
    }

}


创建自己的contentprovider:

public class DatabaseProvider extends ContentProvider {
public static final int BOOK_DIR = 0;
public static final int BOOK_ITEM = 1;
public static final int CATEGORY_DIR = 2;
public static final int CATEGORY_ITEM = 3;
public static final String AUTHORITY = "lewanjiang.com.databasetest.provider";
private static UriMatcher sUriMatcher;
private MyDatabaseHelper dbHelper;

static {
    sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    sUriMatcher.addURI(AUTHORITY,"book", BOOK_DIR);
    sUriMatcher.addURI(AUTHORITY,"book/#",BOOK_ITEM);
    sUriMatcher.addURI(AUTHORITY,"category",CATEGORY_DIR);
    sUriMatcher.addURI(AUTHORITY,"category/#",CATEGORY_ITEM);
}

public DatabaseProvider() {
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    int deleteRows = 0;
    switch (sUriMatcher.match(uri)) {
        case BOOK_DIR:
            deleteRows = db.delete("Book",selection,selectionArgs);
            break;
        case BOOK_ITEM:
            String bookId = uri.getPathSegments().get(1);
            deleteRows = db.delete("Book","id = ?",new String[]{bookId});
            break;
        case CATEGORY_DIR:
            String categoryId = uri.getPathSegments().get(1);
            deleteRows = db.delete("Category","id = ?",new String[]{categoryId});
            break;
        default:
            break;
    }
    return deleteRows;
}

@Override
public String getType(Uri uri) {
    switch (sUriMatcher.match(uri)) {
        case BOOK_DIR:
            return "vnd.android.cursor.dir/vnd.lewanjiang.com.databasetest.provider.book";
        case BOOK_ITEM:
            return "vnd.android.cursor.item/vnd.lewanjiang.com.databasetest.provider.book";
        case CATEGORY_DIR:
            return "vnd.android.cursor.dir/vnd.lewanjiang.com.databasetest.provider.category";
        case CATEGORY_ITEM:
            return "vnd.android.cursor.item/vnd.lewanjiang.com.databasetest.provider.category";
    }
    return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    Uri uriReturn = null;
    switch (sUriMatcher.match(uri)) {
        case BOOK_DIR:
        case BOOK_ITEM:
            long newBookId = db.insert("Book",null,values);
            uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
            break;
        case CATEGORY_DIR:
        case CATEGORY_ITEM:
            long newCategoryId = db.insert("Category",null,values);
            uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
            break;
        default:
            break;
    }
    return uriReturn;
}

@Override
public boolean onCreate() {
    dbHelper = new MyDatabaseHelper(getContext(),"BookStore.db",null,2);
    return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
                    String[] selectionArgs, String sortOrder) {
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = null;
    switch (sUriMatcher.match(uri)) {
        case BOOK_DIR:
            cursor = db.query("Book",projection,selection,selectionArgs,null,null,sortOrder);
            break;
        case BOOK_ITEM:
            String bookId = uri.getPathSegments().get(1);
            cursor = db.query("Book",projection,"id = ?",new String[]{bookId},null,null,sortOrder);
            break;
        case CATEGORY_DIR:
            cursor = db.query("Category",projection,selection,selectionArgs,null,null,sortOrder);
            break;
        case CATEGORY_ITEM:
            String categoryId = uri.getPathSegments().get(1);
            cursor = db.query("Category",projection,"id = ?",new String[]{categoryId},null,null,sortOrder);
            break;
        default:
            break;
    }
    return cursor;
}

@Override
public int update(Uri uri, ContentValues values, String selection,
                  String[] selectionArgs) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    int updateRows = 0;
    switch (sUriMatcher.match(uri)) {
        case BOOK_DIR:
            updateRows = db.update("Book",values,selection,selectionArgs);
            break;
        case BOOK_ITEM:
            String bookId = uri.getPathSegments().get(1);
            updateRows = db.update("Book",values,"id = ?",new String[]{bookId});
            break;
        case CATEGORY_DIR:
            updateRows = db.update("Category",values,selection,selectionArgs);
            break;
        case CATEGORY_ITEM:
            String categoryId = uri.getPathSegments().get(1);
            updateRows = db.update("Category",values,"id = ?",new String[]{categoryId});
            break;
        default:
            break;
    }
    return updateRows;
}

}

Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages",454);
values.put("price",16.96);
db.insert("Book",null,values);
values.clear();
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages",510);
values.put("price",19.95);
db.insert("Book",null,values);
/
Uri uri = Uri.parse("content://lewanjiang.com.databasetest.provider/book");
ContentValues values = new ContentValues();
values.put("name","A Clash of kings");
values.put("author","George Martin");
values.put("pages",1040);
values.put("price",22.85);
Uri newUri = getContentResolver().insert(uri,values);
newId = newUri.getPathSegments().get(1);
}
});
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/

SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages > ?",new String[]{"500"});
*/
Uri uri = Uri.parse("content://lewanjiang.com.databasetest.provider/book/" + newId);
getContentResolver().delete(uri,null,null);
}
});

    Button queryButton = (Button) findViewById(R.id.query_data);
    queryButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /*
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            Cursor cursor = db.query("Book",null,null,null,null,null,null);
            if (cursor.moveToFirst()) {
                do {
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    String author = cursor.getString(cursor.getColumnIndex("author"));
                    int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                    double price = cursor.getDouble(cursor.getColumnIndex("price"));
                    Log.d(TAG, "onClick: book name is " + name);
                    Log.d(TAG, "onClick: book author is " + author);
                    Log.d(TAG, "onClick: book pages is " + pages);
                    Log.d(TAG, "onClick: book price is " + price);
                } while (cursor.moveToNext());
            }
            cursor.close();
            */
            Uri uri = Uri.parse("content://lewanjiang.com.databasetest.provider/book");
            Cursor cursor = getContentResolver().query(uri,null,null,null,null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    String author = cursor.getString(cursor.getColumnIndex("author"));
                    int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                    double price = cursor.getDouble(cursor.getColumnIndex("price"));
                    Log.d(TAG, "onClick: name is " + name);
                    Log.d(TAG, "onClick: book author is " + author);
                    Log.d(TAG, "onClick: book pages is " + pages);
                    Log.d(TAG, "onClick: book price is " + price);
                }
                cursor.close();
            }
        }
    });
    Button updateData = (Button) findViewById(R.id.update_data);
    updateData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Uri uri = Uri.parse("content://lewanjiang.com.database.provider/book/" + newId);
            ContentValues values = new ContentValues();
            values.put("name","A Storm of Swords");
            values.put("pages",1216);
            values.put("price",24.05);
            getContentResolver().update(uri,values,null,null);
        }
    });
}


通知简单用法

Intent intent = new Intent(MainActivity.this,NotificationgActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("title")
.setContentText("neirong")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setAutocancel(true)
.build();
notificationManager.notify(1,notification);

通知的声音和振动:.setDefaults(android.support.v4.app.NotificationCompat.DEFAULT_ALL)
长文本:.setStyle(new NotificationCompat.BigTextStyle().bigText("haha"))
图片:.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_foreground)))
优先级:.setPriority(NotificationCompat.PRIORITY_MAX)

调用摄像头和相册:

public class MainActivity extends AppCompatActivity {

public static final int TAKE_PHOTO = 1;
public static final int CHOOSE_PHOTO = 2;
private ImageView picture;
private Uri imageUri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button takePhoto = (Button) findViewById(R.id.take_photo);
    picture = (ImageView) findViewById(R.id.picture);
    takePhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            File outputImage = new File(getExternalCacheDir(),"output_image.jpg");
            try {
                if (outputImage.exists()) {
                    outputImage.delete();
                }
                outputImage.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (Build.VERSION.SDK_INT >= 24) {
                imageUri = FileProvider.getUriForFile(MainActivity.this,"lewanjiang.com.cameraalbumtest.fileprovider",outputImage);
            } else {
                imageUri = Uri.fromFile(outputImage);
            }
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
            startActivityForResult(intent,TAKE_PHOTO);
        }
    });
    Button chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
    chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            } else {
                openAlbum();
            }
        }
    });
}

private void openAlbum() {
    Intent intent = new Intent("android.intent.action.GET_CONTENT");
    intent.setType("image/*");
    startActivityForResult(intent,CHOOSE_PHOTO);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openAlbum();
            } else {
                Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
            }
            break;
        default:
                break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case TAKE_PHOTO:
            if (resultCode == RESULT_OK) {
                try {
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                    picture.setImageBitmap(bitmap);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        case CHOOSE_PHOTO:
            if (requestCode == RESULT_OK) {
                if (Build.VERSION.SDK_INT >= 19) {
                    handleImageOnKitKat(data);
                } else {
                    handleImageBeforeKitKat(data);
                }
            }
            break;
        default:
                break;
    }
}

@TargetApi(19)
private void handleImageOnKitKat(Intent data) {
    String imagePath = null;
    Uri uri = data.getData();
    if (DocumentsContract.isDocumentUri(this,uri)) {
        String docId = DocumentsContract.getDocumentId(uri);
        if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
            String id = docId.split(":")[1];
            String selection = MediaStore.Images.Media._ID + "=" + id;
            imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
        } else if ("com.android.providers.downloads.document".equals(uri.getAuthority())) {
            Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
            imagePath = getImagePath(contentUri,null);
        }
    } else if ("content".equalsIgnoreCase(uri.getScheme())) {
        imagePath = getImagePath(uri,null);
    } else if ("file".equalsIgnoreCase(uri.getScheme())) {
        imagePath = uri.getPath();
    }
    displayImage(imagePath);
}

private void handleImageBeforeKitKat(Intent data) {
    Uri uri = data.getData();
    String imagePath = getImagePath(uri,null);
    displayImage(imagePath);
}

private String getImagePath(Uri uri,String selection) {
    String path = null;
    Cursor cursor = getContentResolver().query(uri,null,selection,null,null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        }
        cursor.close();
    }
    return path;
}

private void displayImage(String imagePath) {
    if (imagePath != null) {
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        picture.setImageBitmap(bitmap);
    } else {
        Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
    }
}

}


 播放多媒体文件:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private MediaPlayer mMediaPlayer = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button play = (Button) findViewById(R.id.play);
    Button pause = (Button) findViewById(R.id.pause);
    Button stop = (Button) findViewById(R.id.stop);
    play.setOnClickListener(this);
    pause.setOnClickListener(this);
    stop.setOnClickListener(this);
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
    } else {
        initMediaPlayer();
    }
}

private void initMediaPlayer(){
    try {
        File file = new File(Environment.getExternalStorageDirectory(),"music.mp3");
        mMediaPlayer.setDataSource(file.getPath());
        mMediaPlayer.prepare();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initMediaPlayer();
            } else {
                Toast.makeText(this,"yo",Toast.LENGTH_SHORT).show();
                finish();
            }
            break;
        default:
    }
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.play:
            if (!mMediaPlayer.isPlaying()) {
                mMediaPlayer.start();
            }
            break;
        case R.id.pause:
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.pause();
            }
            break;
        case R.id.stop:
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.reset();
                initMediaPlayer();
            }
            break;
        default:
            break;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mMediaPlayer != null) {
        mMediaPlayer.stop();
        mMediaPlayer.release();
    }
}

}

视频播放:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    videoView = (VideoView) findViewById(R.id.video_view);
    Button play = (Button) findViewById(R.id.play);
    Button pause = (Button) findViewById(R.id.pause);
    Button replay = (Button) findViewById(R.id.replay);
    play.setOnClickListener(this);
    pause.setOnClickListener(this);
    replay.setOnClickListener(this);
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
    } else {
        initVideoPath();
    }
}

private void initVideoPath() {
    File file = new File(Environment.getExternalStorageDirectory(),"movie.mp4");
    videoView.setVideoPath(file.getPath());
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initVideoPath();
            } else {
                Toast.makeText(this,"you denied permission",Toast.LENGTH_SHORT).show();
                finish();
            }
            break;
        default:
    }
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.play:
            if (!videoView.isPlaying()) {
                videoView.start();
            }
            break;
        case R.id.pause:
            if (videoView.isPlaying()) {
                videoView.pause();
            }
            break;
        case R.id.replay:
            if (videoView.isPlaying()) {
                videoView.resume();
            }
            break;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (videoView != null) {
        videoView.suspend();
    }
}

}


 九、网络
使用WebView:

private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broswer);
webView = (WebView)findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://m.newmotor.com.cn/Brand/");

}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}



1.HttpURLConnection:
GET:

private void sendRequestWithHttpURLconnection () {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL("http://bing.com");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream in = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
showResponse(response.toString());
} catch (Exception e){
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}

private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
responseTest.setText(response);
}
});
}

POST:

connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=233");

2.OKHttp
GET:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://g.cn").build();
Response respone = client.newCall(request).execute();
String responseData = response.body().string

POST:

Request requestBody = new FormBody.Builder().add("username","admin").add("password","666").build();
Request request = newe Request.Builder().url("http://g.cn").post(requestBody).build();
compile 'com.squareup.okhttp3:okhttp:3.6.0'
private void sendRequestWithOKHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://bing.com").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}


3.XML解析:
3.1 PULL:

private void parseXMLWithPull(String xmlData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)){
id = xmlPullParser.nextText();
} else if ("name".equals(nodeName)){
name = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("app".equals(nodeName)){
Log.d("MainActivity","id is " + id);
Log.d("MainActivity","name is " + name);
}
break;
default:
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}

3.2 SAX:

public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;

@Override
public void startDocument() throws SAXException {
    id = new StringBuilder();
    name = new StringBuilder();
}

@Override
public void startElement(String uri, String localName, Attributes attributes) throws SAXException {
    nodeName = localName;
}

@Override
public void characters(char[] ch,int start,int length) throws SAXException {
    if ("id".equals(nodeName)) {
        id.append(ch,start,length);
    } else if ("name".equals(nodeName)) {
        name.append(ch,start,length);
    }
}

@Override
public void endElement(String uri,String localName,String qName) throws SAXException {

        if ("app".equals(localName)) {
            Log.d("ContentHandler","id is " + id);
            Log.d("ContentHandler","name is " + name);
            id.setLength(0);
            name.setLength(0);
        }

}

@Override
public void endDocument() throws SAXException{
    super.endDocument();
}

}
private void parseXMLWithSAX(String xmlData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (Exception e) {
e.printStackTrace();
}
}

4.JSON解析:
4.1 JSONObject:

private void parseJSONWithJSONObject(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i=0;i<jsonArray.length();i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
Log.d("MainActivity","id is " + id);
Log.d("MainActivity","name is " + name);
}
}catch (Exception e) {
e.printStackTrace();
}
}

4.2 GSON:

compile 'com.google.code.gson:gson:2.8'
private void parseJSONWithGSON(String jsonData) {
Gson gson = new Gson();
List<App> appList = gson.fromJson(jsonData,new TypeToken<List<App>>(){}.getRawType());
for (App app:appList) {
Log.d("MainActivity","id is " + app.getId());
Log.d("MainAcitvity","name is " + app.getName());
}
}

5.封装网络操作:

public class HttpUtil {
public static void sendOkHttpRequest(String address,okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}

调用:

String address = "http://zcsj8.pe.hu";
HttpUtil.sendOkHttpRequest(address,new okhttp3.Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
String responsData = response.body().string();
showResponse(responsData);
}

@Override
public void onFailure(Call call,IOException e) {

}

});


1.利用Handler子线程更新UI:

private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
textView.setText("haha");
}
}
};
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}).start();



1.新建一个Service:

public class MyService extends Service {
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

@Override
public void onCreate(){
    super.onCreate();
}

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

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

}

2.启动服务:

Intent startIntent = new Intent(this,MyService.class);
startService(startIntent);

3.停止服务:

Intent stopIntent = new Intent(this,MyService.class);
stopService(stopIntent);

4.与活动绑定:
4.1 Service中添加如下:
private DownloadBinder mBinder = new DownloadBinder();
class DownloadBinder extends Binder {
    public void startDownload() {
        Log.d("MyService","start Download");
    }

    public int getProgress() {
        Log.d("MyService","getProgress");
        return 0;
    }
}
4.2 修改MainActivity:

private MyService.DownloadBinder downloadBinder;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}

@Override
public void onServiceDisconnected(ComponentName name) {

}

};
Intent bindIntent = new Intent(this,MyService.class);
bindService(bindIntent,mServiceConnection,BIND_AUTO_CREATE);

5.解除绑定:

unbindService(mServiceConnection);

6.前台服务,修改MyService中onCreate方法:

public void onCreate(){
super.onCreate();
Intent intent = new Intent(this,MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("title")
.setContentText("haha")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pi)
.build();
startForeground(1,notification);
}

7.IntentService解决了异步和不能自动停止问题,不要忘记manifest文件中声明:

public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    Log.d("MyIntentService","Thread id is " + Thread.currentThread().getId());
}

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

}

8.后台自动更新:

public class AutoUpdateService extends Service {
public AutoUpdateService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public int onStartCommand(Intent intent,int flags,int startId) {
    update();
    AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE):
    int intevelTime = 3 * 60 * 60 * 1000;
    long triggerAtTime = SystemClock.elapsedRealtime() + intevelTime;
    Intent i = new Intent(this,AutoUpdateService.class);
    PendingIntent pi = PendingIntent.getService(this,0,i,0);
    manager.cancel(pi);
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pi);
    return super.onStartCommand(intent,flags,startId);
}


9.下载示例:
9.1 定义一个回调接口:

public interface DownloadListener {
void onProgress(int progress);

void onSuccess();

void onFailed();

void onPaused();

void onCanceled();

}

8.2 实现下载功能:

public class DownloadTask extends AsyncTask<String,Integer,Integer> {
public static final int TYPE_SUCCESS = 0;
public static final int TYPE_FAILED = 1;
public static final int TYPE_PAUSED = 2;
public static final int TYPE_CANCELED = 3;

private DownloadListener listener;

private boolean isCanceled = false;
private boolean isPaused = false;
private int lastProgress;

public DownloadTask(DownloadListener listener) {
    this.listener = listener;
}

@Override
protected Integer doInBackground(String... params){
    InputStream is = null;
    RandomAccessFile savedFile = null;
    File file = null;
    try {
        long downloadedLength = 0;
        String downloadUrl = params[0];
        String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/"));
        String directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
        file = new File(directory + fileName);
        if (file.exists()) {
            downloadedLength = file.length();
        }
        long contentLength = getContentLength(downloadUrl);
        if (contentLength == 0) {
            return TYPE_FAILED;
        } else if (contentLength == downloadedLength) {
            return TYPE_SUCCESS;
        }
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .addHeader("RANGE","bytes=" + downloadedLength + "-")
                .url(downloadUrl)
                .build();
        Response response = client.newCall(request).execute();
        if (response != null) {
            is = response.body().byteStream();
            savedFile = new RandomAccessFile(file,"rw");
            savedFile.seek(downloadedLength);
            byte[] b = new byte[1024];
            int total = 0;
            int len;
            while ((len = is.read(b)) != -1) {
                if (isCanceled) {
                    return TYPE_CANCELED;
                } else if (isPaused) {
                    return TYPE_PAUSED;
                } else {
                    total += len;
                    savedFile.write(b,0,len);
                    int progress = (int) ((total + downloadedLength) * 100 / contentLength);
                    publishProgress(progress);
                }
            }
            response.body().close();
            return TYPE_SUCCESS;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null) {
                is.close();
            }
            if (savedFile != null) {
                savedFile.close();
            }
            if (isCanceled && file != null) {
                file.delete();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return TYPE_FAILED;
}

@Override
protected void onProgressUpdate(Integer... values) {
    int progress = values[0];
    if (progress > lastProgress) {
        listener.onProgress(progress);
        lastProgress = progress;
    }
}

@Override
protected void onPostExecute(Integer status) {
    switch (status) {
        case TYPE_SUCCESS:
            listener.onSuccess();
            break;
        case TYPE_FAILED:
            listener.onFailed();
            break;
        case TYPE_PAUSED:
            listener.onPaused();
            break;
        case TYPE_CANCELED:
            listener.onCanceled();
            break;
        default:
            break;
    }
}

public void pauseDownload() {
    isPaused = true;
}

public void cancelDownload() {
    isCanceled = true;
}

private long getContentLength(String downloadUrl) throws IOException {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url(downloadUrl).build();
    Response response = client.newCall(request).execute();
    if (response != null && response.isSuccessful()) {
        long contentLength = response.body().contentLength();
        response.close();
        return contentLength;
    }
    return 0;
}

}


8.3 把下载功能放在服务中:

public class DownloadService extends Service {
private DownloadTask downloadTask;
private String downloadUrl;
private DownloadListener listener = new DownloadListener() {
@Override
public void onProgress(int progress) {
getNotificationManager().notify(1,getNotification("Download...",progress));
}

    @Override
    public void onSuccess() {
        downloadTask = null;
        stopForeground(true);
        getNotificationManager().notify(1,getNotification("Download Success",-1));
        Toast.makeText(DownloadService.this,"Download Success",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailed() {
        downloadTask = null;
        stopForeground(true);
        getNotificationManager().notify(1,getNotification("Download Failed",-1));
        Toast.makeText(DownloadService.this,"Download Failed",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onPaused() {
        downloadTask = null;
        Toast.makeText(DownloadService.this,"Paused",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCanceled() {
        downloadTask = null;
        stopForeground(true);
        Toast.makeText(DownloadService.this,"Canceled",Toast.LENGTH_SHORT).show();
    }
};

private DownloadBinder mBinder = new DownloadBinder();

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}
class DownloadBinder extends Binder {
    public void startDownload(String url) {
        if (downloadTask == null) {
            downloadUrl = url;
            downloadTask = new DownloadTask(listener);
            downloadTask.execute(downloadUrl);
            startForeground(1, getNotification("Downloading...", 0));
            Toast.makeText(DownloadService.this, "Downloading...", Toast.LENGTH_SHORT).show();
        }
    }

    public void pauseDownload() {
        if (downloadTask != null) {
            downloadTask.pauseDownload();
        }
    }

    public void cancelDownload() {
        if (downloadTask != null) {
            downloadTask.cancelDownload();
        } else {
            if (downloadUrl != null) {
                String fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/"));
                String directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
                File file = new File(directory + fileName);
                if (file.exists()) {
                    file.delete();
                }
                getNotificationManager().cancel(1);
                stopForeground(true);
                Toast.makeText(DownloadService.this, "Canceled", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

private NotificationManager getNotificationManager() {
    return (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}

private Notification getNotification(String title, int progress) {
    Intent intent = new Intent(this,MainActivity.class);
    PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setSmallIcon(R.mipmap.ic_launcher);
    builder.setContentIntent(pi);
    builder.setContentTitle(title);
    if (progress > 0) {
        builder.setContentText(progress + "%");
        builder.setProgress(100,progress,false);
    }
    return builder.build();
}

}

8.4 修改MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private DownloadService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (DownloadService.DownloadBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button startDownload = (Button)findViewById(R.id.start_download);
    Button pauseDownload = (Button) findViewById(R.id.pause_download);
    Button cancelDownload = (Button) findViewById(R.id.cancel_download);
    startDownload.setOnClickListener(this);
    pauseDownload.setOnClickListener(this);
    cancelDownload.setOnClickListener(this);

    Intent intent = new Intent(this,DownloadService.class);
    startService(intent);
    bindService(intent,connection,BIND_AUTO_CREATE);

    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
    }
}

@Override
public void onClick(View v) {
    if (downloadBinder == null) {
        return;
    }
    switch (v.getId()) {
        case R.id.start_download:
            String url = "https://raw.githubusercontent.com/guolindev/eclipse/master/eclipse-inst-win64.exe";
            downloadBinder.startDownload(url);
            break;
        case R.id.pause_download:
            downloadBinder.pauseDownload();
            break;
        case R.id.cancel_download:
            downloadBinder.cancelDownload();
            break;
        default:
            break;
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this,"denied will use this app",Toast.LENGTH_SHORT).show();
                finish();
            }
            break;
        default:
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(connection);
}

}

8.5 在manifest中声明网络和存储权限
INTERNET,WRITE_EXTERNAL_STORAGE

百度地图开发

1.注册appkey,下载相关包,把jar文件放入libs文件夹,把其他文件夹放入main/jniLibs下

2.manifest中声明权限,增加<meta-data />和<service>标签内容

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="rpMB29dvc4O1GBG3ypmlVmQ9oZBdIDKb" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />

3. 使用百度定位:

public class MainActivity extends AppCompatActivity {

public LocationClient mLocationClient;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mLocationClient = new LocationClient(getApplicationContext());
    mLocationClient.registerLocationListener(new MyLocationListener());
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.text_view);
    List<String> per = new ArrayList<>();
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
        per.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
        per.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    }
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){
        per.add(Manifest.permission.READ_PHONE_STATE);
    }
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
        per.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (!per.isEmpty()){
        String[] permissions = per.toArray(new String[per.size()]);
        ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
    } else
        requestLocation();
}

private void requestLocation(){
    initLocatioin();
    mLocationClient.start();
}

private void initLocatioin(){
    LocationClientOption option = new LocationClientOption();
    option.setScanSpan(5000);
    mLocationClient.setLocOption(option);
    option.setCoorType("bd09ll");
}

public class MyLocationListener extends BDAbstractLocationListener {
    @Override
    public void onReceiveLocation(BDLocation location) {
        if (location.getLocType() == BDLocation.TypeGpsLocation
                || location.getLocType() == BDLocation.TypeNetWorkLocation) {
            mTextView.setText("haha");
        }
    }
}

public void onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0) {
                for (int result:grantResults) {
                    if (result != PackageManager.PERMISSION_GRANTED){
                        Toast.makeText(this,"必须同意权限才能使用",Toast.LENGTH_LONG).show();
                        finish();
                        return;
                    }
                }
                requestLocation();
            } else {
                Toast.makeText(this,"wrong",Toast.LENGTH_LONG).show();
                finish();
            }
            break;
        default:
    }
}

}

4.显示地图

<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />

super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);

@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();;
}

5.移动到当前位置

private BaiduMap baiduMap;
baiduMap = mapView.getMap();
private void navigateTo(BDLocation location){
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);

}

}

public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location.getLocType() == BDLocation.TypeGpsLocation
|| location.getLocType() == BDLocation.TypeNetWorkLocation) {
navigateTo(location);
}
}
}

6.显示当前位置点

baiduMap.setMyLocationEnabled(true);
private void navigateTo(BDLocation location){
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);

MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(location.getLatitude());
locationBuilder.longitude(location.getLongitude());
MyLocationData locationData = locationBuilder.build();
baiduMap.setMyLocationData(locationData);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容