美文网首页
5.《第一行代码》笔记二

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

作者: 为梦想战斗 | 来源:发表于2017-10-15 18:43 被阅读0次

    六、 文件读写、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);
    

    相关文章

      网友评论

          本文标题:5.《第一行代码》笔记二

          本文链接:https://www.haomeiwen.com/subject/umbcuxtx.html